From ada38d307d79985e1509462d78f41a3719a7975e Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Fri, 1 Dec 2023 16:12:16 +0100 Subject: [PATCH 01/47] add list of element identifiers --- pyscal_rdf/data/element.yml | 62 +++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 pyscal_rdf/data/element.yml diff --git a/pyscal_rdf/data/element.yml b/pyscal_rdf/data/element.yml new file mode 100644 index 0000000..d469482 --- /dev/null +++ b/pyscal_rdf/data/element.yml @@ -0,0 +1,62 @@ +Ac: + https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33337 +Ag:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30512 +Al:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28984 +Ar:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49475 +Au:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:29287 +Ba:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:32594 +Be:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30501 +Ca:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:22984 +Cd:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:22977 +Ce:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33369 +Co:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27638 +Cr:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28073 +Cs:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30514 +Cu:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28694 +Dy:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=33377 +Er:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=33379 +Eu:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=32999 +Fe:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:18248 +Gd:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33375 +Ge:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30441 +He:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30217 +Hf:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33343 +Ho:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49648 +Ir:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49666 +Kr:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49696 +La:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33336 +Li:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30145 +Lu:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33382 +Mg:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:25107 +Mo:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28685 +Na:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:26708 +Nb:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33344 +Nd:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33372 +Ne:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33310 +Ni:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28112 +Os:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30687 +Pb:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:25016 +Pd:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33363 +Po:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33313 +Pr:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49828 +Pt:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33364 +Rb:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33322 +Re:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49882 +Rh:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33359 +Ru:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30682 +Sc:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33330 +Se:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27568 +Si:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27573 +Sr:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33324 +Ta:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33348 +Tb:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33376 +Tc:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33353 +Te:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30452 +Th:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33385 +Ti:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33341 +Tl:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30440 +Tm:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33380 +Xe:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49957 +Yb:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33381 +Zn:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27363 +Zr:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33342 From 98aee137a5512e6da7f3a6b064b2c8b8d83ffc73 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Fri, 1 Dec 2023 16:22:49 +0100 Subject: [PATCH 02/47] update routine for element --- pyscal_rdf/graph.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 3b97e4f..5658ef4 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -13,6 +13,7 @@ from ase.io import write import copy import pandas as pd +import yaml from pyscal_rdf.visualize import visualize_graph from pyscal_rdf.network.network import OntologyNetwork @@ -26,6 +27,13 @@ PLDO = Namespace("http://purls.helmholtz-metadaten.de/pldo/") PODO = Namespace("http://purls.helmholtz-metadaten.de/podo/") +#read element data file +file_location = os.path.dirname(__file__).split('/') +file_location = "/".join(file_location[:-1]) +file_location = os.path.join(file_location, 'data/element.yml') +with open(file_location, 'r') as fin: + element_indetifiers = yaml.safe_load(fin) + defstyledict = { "BNode": {"color": "#ffe6ff", @@ -132,10 +140,8 @@ def process_structure(self, structure, format=None): def data(self, key): #this method gets info directly from the dict - if key=="ChemicalCompositionElement": - return list(self.sys.composition.keys()) - elif key=="ChemicalCompositionRatio": - return [val for key, val in self.sys.composition.items()] + if key=="ChemicalComposition": + return self.sys.composition elif key=="CellVolume": return self.sys.volume elif key=="NumberOfAtoms": @@ -349,10 +355,17 @@ def add_chemical_composition(self, name=None): Returns ------- """ + composition = self.data("ChemicalComposition") - chem_comp = ["=".join([str(x), str(y)]) for x,y in zip(self.data("ChemicalCompositionElement"), self.data("ChemicalCompositionRatio"))] - for x in range(len(chem_comp)): - self.add((self.material, CMSO.hasElementRatio, Literal(chem_comp[x], datatype=XSD.string))) + chemical_species = BNode(name) + self.add((self.sample, CMSO.hasSpecies, chemical_species)) + self.add((chemical_species, RDF.type, CMSO.ChemicalSpecies)) + + for e, r in composition.keys(): + if e in element_indetifiers.keys(): + element = URIRef(element_indetifiers[e]) + self.add((element, CMSO.hasSymbol, Literal(e, datatype=XSD.string))) + self.add((element, CMSO.hasElementRatio, Literal(r, datatype=XSD.float))) def add_simulation_cell(self, name=None): """ From e332af249e816bf9c03f34132f283c612188e808 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Fri, 1 Dec 2023 16:24:26 +0100 Subject: [PATCH 03/47] update manifest --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index fa8dea0..e1ed044 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1 +1,2 @@ include pyscal_rdf/data/*.owl +include pyscal_rdf/data/*.yml From 4e7d19d39726d3c2cd2e6ea12ca01f8ffe3fd123 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Fri, 1 Dec 2023 16:30:09 +0100 Subject: [PATCH 04/47] bug fix in assigning element identifiers --- MANIFEST.in | 3 +- pyscal_rdf/data/element.yml | 123 ++++++++++++++++++------------------ pyscal_rdf/graph.py | 2 +- 3 files changed, 63 insertions(+), 65 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index e1ed044..0574cc6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1 @@ -include pyscal_rdf/data/*.owl -include pyscal_rdf/data/*.yml +include pyscal_rdf/data/*.??l diff --git a/pyscal_rdf/data/element.yml b/pyscal_rdf/data/element.yml index d469482..271fa97 100644 --- a/pyscal_rdf/data/element.yml +++ b/pyscal_rdf/data/element.yml @@ -1,62 +1,61 @@ -Ac: - https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33337 -Ag:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30512 -Al:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28984 -Ar:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49475 -Au:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:29287 -Ba:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:32594 -Be:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30501 -Ca:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:22984 -Cd:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:22977 -Ce:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33369 -Co:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27638 -Cr:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28073 -Cs:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30514 -Cu:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28694 -Dy:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=33377 -Er:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=33379 -Eu:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=32999 -Fe:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:18248 -Gd:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33375 -Ge:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30441 -He:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30217 -Hf:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33343 -Ho:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49648 -Ir:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49666 -Kr:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49696 -La:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33336 -Li:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30145 -Lu:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33382 -Mg:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:25107 -Mo:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28685 -Na:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:26708 -Nb:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33344 -Nd:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33372 -Ne:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33310 -Ni:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28112 -Os:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30687 -Pb:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:25016 -Pd:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33363 -Po:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33313 -Pr:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49828 -Pt:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33364 -Rb:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33322 -Re:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49882 -Rh:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33359 -Ru:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30682 -Sc:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33330 -Se:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27568 -Si:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27573 -Sr:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33324 -Ta:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33348 -Tb:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33376 -Tc:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33353 -Te:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30452 -Th:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33385 -Ti:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33341 -Tl:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30440 -Tm:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33380 -Xe:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49957 -Yb:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33381 -Zn:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27363 -Zr:,https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33342 +Ac: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33337 +Ag: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30512 +Al: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28984 +Ar: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49475 +Au: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:29287 +Ba: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:32594 +Be: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30501 +Ca: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:22984 +Cd: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:22977 +Ce: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33369 +Co: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27638 +Cr: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28073 +Cs: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30514 +Cu: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28694 +Dy: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=33377 +Er: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=33379 +Eu: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=32999 +Fe: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:18248 +Gd: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33375 +Ge: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30441 +He: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30217 +Hf: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33343 +Ho: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49648 +Ir: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49666 +Kr: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49696 +La: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33336 +Li: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30145 +Lu: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33382 +Mg: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:25107 +Mo: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28685 +Na: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:26708 +Nb: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33344 +Nd: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33372 +Ne: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33310 +Ni: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28112 +Os: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30687 +Pb: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:25016 +Pd: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33363 +Po: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33313 +Pr: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49828 +Pt: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33364 +Rb: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33322 +Re: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49882 +Rh: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33359 +Ru: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30682 +Sc: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33330 +Se: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27568 +Si: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27573 +Sr: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33324 +Ta: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33348 +Tb: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33376 +Tc: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33353 +Te: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30452 +Th: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33385 +Ti: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33341 +Tl: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30440 +Tm: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33380 +Xe: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:49957 +Yb: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33381 +Zn: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27363 +Zr: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33342 \ No newline at end of file diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 5658ef4..c43b1b7 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -30,7 +30,7 @@ #read element data file file_location = os.path.dirname(__file__).split('/') file_location = "/".join(file_location[:-1]) -file_location = os.path.join(file_location, 'data/element.yml') +file_location = os.path.join(os.path.dirname(__file__), 'data/element.yml') with open(file_location, 'r') as fin: element_indetifiers = yaml.safe_load(fin) From 2c880eaff2fa7d3b0f0fd566d4214fa9f7c4c348 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Fri, 1 Dec 2023 16:47:28 +0100 Subject: [PATCH 05/47] add unit cell properties --- pyscal_rdf/graph.py | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index c43b1b7..205705b 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -167,22 +167,49 @@ def data(self, key): elif key=="SimulationCellAngleGamma": return prp.get_angle(self.sys.box[2], self.sys.box[0]) + elif key=="LatticeAngleAlpha": + if self.sys._structure_dict is not None: + return prp.get_angle(self.sys._structure_dict["box"][0], self.sys._structure_dict["box"][1]) + return None + elif key=="LatticeAngleBeta": + if self.sys._structure_dict is not None: + return prp.get_angle(self.sys._structure_dict["box"][1], self.sys._structure_dict["box"][2]) + return None + elif key=="LatticeAngleGamma": + if self.sys._structure_dict is not None: + return prp.get_angle(self.sys._structure_dict["box"][2], self.sys._structure_dict["box"][0]) + return None + elif key=="Element": if self.sys.atoms.species[0] is not None: return self.sys.atoms.species else: return self.sys.atoms.types + elif key=="Coordination": return prp.get_coordination(self.sys) + elif key=="Positions": return self.sys.atoms.positions + elif key=="LatticeParameter": - return self.sys.atoms._lattice_constant + if self.sys.atoms._lattice_constant is None: + return [None, None, None] + else: + if self.sys._structure_dict is not None: + return [np.linalg.norm(self.sys._structure_dict["box"][0])*self.sys.atoms._lattice_constant, + np.linalg.norm(self.sys._structure_dict["box"][1])*self.sys.atoms._lattice_constant, + np.linalg.norm(self.sys._structure_dict["box"][2])*self.sys.atoms._lattice_constant] + else: + return [self.sys.atoms._lattice_constant, + self.sys.atoms._lattice_constant, + self.sys.atoms._lattice_constant] elif key=="SpaceGroupSymbol": if self.sys._structure_dict is not None: symbol, number = prp.get_space_group(self.sys) return symbol + elif key=="SpaceGroupNumber": if self.sys._structure_dict is not None: symbol, number = prp.get_space_group(self.sys) @@ -216,7 +243,7 @@ def data(self, key): elif key=="LatticeVectors": if self.sys._structure_dict is not None: - return prp.get_lattice_vector(self.sys) + return self.sys_structure_dict["box"] else: return None @@ -532,9 +559,9 @@ def add_lattice_properties(self, name=None): lattice_parameter_01 = BNode(uname) self.add((self.unit_cell, CMSO.hasLatticeParamter, lattice_parameter_01)) self.add((lattice_parameter_01, RDF.type, CMSO.LatticeParameter)) - self.add((lattice_parameter_01, CMSO.hasLength_x, Literal(self.data("LatticeParameter"), datatype=XSD.float))) - self.add((lattice_parameter_01, CMSO.hasLength_y, Literal(self.data("LatticeParameter"), datatype=XSD.float))) - self.add((lattice_parameter_01, CMSO.hasLength_z, Literal(self.data("LatticeParameter"), datatype=XSD.float))) + self.add((lattice_parameter_01, CMSO.hasLength_x, Literal(self.data("LatticeParameter")[0], datatype=XSD.float))) + self.add((lattice_parameter_01, CMSO.hasLength_y, Literal(self.data("LatticeParameter")[1], datatype=XSD.float))) + self.add((lattice_parameter_01, CMSO.hasLength_z, Literal(self.data("LatticeParameter")[2], datatype=XSD.float))) uname = None if name is not None: @@ -542,9 +569,9 @@ def add_lattice_properties(self, name=None): lattice_angle_01 = BNode(uname) self.add((self.unit_cell, CMSO.hasAngle, lattice_angle_01)) self.add((lattice_angle_01, RDF.type, CMSO.LatticeAngle)) - self.add((lattice_angle_01, CMSO.hasAngle_alpha, Literal(90, datatype=XSD.float))) - self.add((lattice_angle_01, CMSO.hasAngle_beta, Literal(90, datatype=XSD.float))) - self.add((lattice_angle_01, CMSO.hasAngle_gamma, Literal(90, datatype=XSD.float))) + self.add((lattice_angle_01, CMSO.hasAngle_alpha, Literal(self.data("LatticeAngleAlpha"), datatype=XSD.float))) + self.add((lattice_angle_01, CMSO.hasAngle_beta, Literal(self.data("LatticeAngleBeta"), datatype=XSD.float))) + self.add((lattice_angle_01, CMSO.hasAngle_gamma, Literal(self.data("LatticeAngleGamma"), datatype=XSD.float))) def add_atoms(self, name=None): """ From 2574f6bf943d074c8259b8a18b5858b0a3987f05 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Fri, 1 Dec 2023 17:12:51 +0100 Subject: [PATCH 06/47] update graph, atoms work in progress --- pyscal_rdf/graph.py | 55 ++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 205705b..4cb7148 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -585,45 +585,38 @@ def add_atoms(self, name=None): Returns ------- """ - self._atom_ids = [] + if "positions" in self.sys.atoms.keys(): + uname = None + if name is not None: + uname = f'{name}_{x}_Position' + position = BNode(uname) + self.add((self.sample, CMSO.hasAttribute, position)) + self.add((position, RDF.type, CMSO.AtomAttribute)) - positions = self.data("Positions") - elements = self.data("Element") - coordination = self.data("Coordination") - for x in range(len(positions)): + if "species" in self.sys.atoms.keys(): uname = None if name is not None: - uname = f'{name}_{x}' - #create atom - atom = BNode(uname) - self._atom_ids.append(atom) - self.add((self.sample, CMSO.hasAtom, atom)) - self.add((atom, RDF.type, CMSO.Atom)) + uname = f'{name}_{x}_Element' + species = BNode(uname) + self.add((self.sample, CMSO.hasAttribute, species)) + self.add((species, RDF.type, CMSO.AtomAttribute)) + if "velocities" in self.sys.atoms.keys(): uname = None if name is not None: - uname = f'{name}_{x}_Position' - position = BNode(uname) - self.add((atom, CMSO.hasPositionVector, position)) - self.add((position, RDF.type, CMSO.PositionVector)) - self.add((position, CMSO.hasComponent_x, Literal(positions[x][0], - datatype=XSD.float))) - self.add((position, CMSO.hasComponent_y, Literal(positions[x][1], - datatype=XSD.float))) - self.add((position, CMSO.hasComponent_z, Literal(positions[x][2], - datatype=XSD.float))) - #now add coordination + uname = f'{name}_{x}_Element' + velocity = BNode(uname) + self.add((self.sample, CMSO.hasAttribute, velocity)) + self.add((velocity, RDF.type, CMSO.AtomAttribute)) + + if "forces" in self.sys.atoms.keys(): uname = None if name is not None: - uname = f'{name}_{x}_Element' - element = BNode(uname) - self.add((atom, CMSO.hasElement, element)) - self.add((element, RDF.type, CMSO.Element)) - self.add((element, CMSO.hasSymbol, Literal(str(elements[x]), - datatype=XSD.string))) - #finally occupancy - self.add((atom, CMSO.hasCoordinationNumber, Literal(coordination[x], - datatype=XSD.integer))) + uname = f'{name}_{x}_Element' + force = BNode(uname) + self.add((self.sample, CMSO.hasAttribute, force)) + self.add((force, RDF.type, CMSO.AtomAttribute)) + From af5ef9fd077383d8121579973cff3317a8e3d77d Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 14:50:13 +0100 Subject: [PATCH 07/47] update atom mapping --- pyscal_rdf/graph.py | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 4cb7148..07de1d4 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -584,38 +584,51 @@ def add_atoms(self, name=None): Returns ------- + + Notes + ----- + Note that for the moment, we will dump the structures in a given folder, + maybe this could be input from the Job class directly """ if "positions" in self.sys.atoms.keys(): uname = None if name is not None: - uname = f'{name}_{x}_Position' + uname = f'{name}_Position' position = BNode(uname) self.add((self.sample, CMSO.hasAttribute, position)) - self.add((position, RDF.type, CMSO.AtomAttribute)) + self.add((position, RDF.type, CMSO.AtomAttribute)) + self.add((position, CMSO.hasName, Literal('Position', data_type=XSD.string))) + self.add(()) if "species" in self.sys.atoms.keys(): uname = None if name is not None: - uname = f'{name}_{x}_Element' + uname = f'{name}_Species' species = BNode(uname) self.add((self.sample, CMSO.hasAttribute, species)) - self.add((species, RDF.type, CMSO.AtomAttribute)) + self.add((species, RDF.type, CMSO.AtomAttribute)) + self.add((species, CMSO.hasName, Literal('Species', data_type=XSD.string)) + self.add(()) if "velocities" in self.sys.atoms.keys(): uname = None if name is not None: - uname = f'{name}_{x}_Element' + uname = f'{name}_Velocity' velocity = BNode(uname) self.add((self.sample, CMSO.hasAttribute, velocity)) - self.add((velocity, RDF.type, CMSO.AtomAttribute)) + self.add((velocity, RDF.type, CMSO.AtomAttribute)) + self.add((velocity, CMSO.hasName, Literal('Velocity', data_type=XSD.string)) + self.add(()) if "forces" in self.sys.atoms.keys(): uname = None if name is not None: - uname = f'{name}_{x}_Element' + uname = f'{name}_Force' force = BNode(uname) self.add((self.sample, CMSO.hasAttribute, force)) - self.add((force, RDF.type, CMSO.AtomAttribute)) + self.add((force, RDF.type, CMSO.AtomAttribute)) + self.add((force, CMSO.hasName, Literal('Force', data_type=XSD.string)) + self.add(()) From c73fe0af55e421424822d03a4e730f3524087a16 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 14:59:41 +0100 Subject: [PATCH 08/47] update structure store --- pyscal_rdf/graph.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 07de1d4..f68fb4a 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -60,23 +60,28 @@ def _replace_keys(refdict, indict): refdict[key] = val return refdict +def _setup_structure_store(structure_store): + if structure_store is None: + structure_store = os.path.join(os.getcwd(), 'pyscal_rdf_structure_store') + if not os.path.exists(structure_store): + os.mkdir(structure_store) + return structure_store + class RDFGraph: def __init__(self, graph_file=None, store="Memory", store_file=None, identifier="http://default_graph", - ontology=None): + ontology=None, + structure_store=None): self.store_file = store_file - #owlfile = os.path.join(os.path.dirname(__file__), "data/cmso.owl") - #self.graph.parse(owlfile, format='xml') + self.structure_store = structure_store + + if store == "Memory": self.graph = Graph(store="Memory", identifier=identifier) - #elif store=="Oxigraph": - # self.graph = Graph(store="Oxigraph", identifier=identifier) - # if store_file is not None: - # self.graph.open(store_file) elif store=="SQLAlchemy": if store_file is None: @@ -89,16 +94,25 @@ def __init__(self, graph_file=None, try: prpath = store.path dbfile = os.path.join(prpath, 'project.db') + #now start sqlalchemy instance self.graph = Graph(store="SQLAlchemy", identifier=identifier) uri = Literal(f"sqlite:///{dbfile}") self.graph.open(uri, create=True) + + #here modify structure store if needed + if self.structure_store is None: + self.structure_store = os.path.join(prpath, 'pyscal_rdf_structure_store') except: raise ValueError("store should be pyiron_project, SQLAlchemy, or Memory") else: raise ValueError("store should be pyiron_project, SQLAlchemy, or Memory") - + + #start the storage + _set_structure_store(self.structure_store) + + #start binding self.graph.bind("cmso", CMSO) self.graph.bind("pldo", PLDO) From 6c5c13a216802e313cb8664a28671b02a6c618a5 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 15:04:33 +0100 Subject: [PATCH 09/47] add identifiers --- pyscal_rdf/graph.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index f68fb4a..06b61c6 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -14,6 +14,7 @@ import copy import pandas as pd import yaml +import uuid from pyscal_rdf.visualize import visualize_graph from pyscal_rdf.network.network import OntologyNetwork @@ -612,7 +613,8 @@ def add_atoms(self, name=None): self.add((self.sample, CMSO.hasAttribute, position)) self.add((position, RDF.type, CMSO.AtomAttribute)) self.add((position, CMSO.hasName, Literal('Position', data_type=XSD.string))) - self.add(()) + position_identifier = uuid.uuid4() + self.add((position, CMSO.hasIdentifier, Literal(position_identifier, datatype=XSD.string))) if "species" in self.sys.atoms.keys(): uname = None @@ -621,8 +623,9 @@ def add_atoms(self, name=None): species = BNode(uname) self.add((self.sample, CMSO.hasAttribute, species)) self.add((species, RDF.type, CMSO.AtomAttribute)) - self.add((species, CMSO.hasName, Literal('Species', data_type=XSD.string)) - self.add(()) + self.add((species, CMSO.hasName, Literal('Species', data_type=XSD.string))) + species_identifier = uuid.uuid4() + self.add((species, CMSO.hasIdentifier, Literal(species_identifier, datatype=XSD.string))) if "velocities" in self.sys.atoms.keys(): uname = None @@ -631,8 +634,9 @@ def add_atoms(self, name=None): velocity = BNode(uname) self.add((self.sample, CMSO.hasAttribute, velocity)) self.add((velocity, RDF.type, CMSO.AtomAttribute)) - self.add((velocity, CMSO.hasName, Literal('Velocity', data_type=XSD.string)) - self.add(()) + self.add((velocity, CMSO.hasName, Literal('Velocity', data_type=XSD.string))) + velocity_identifier = uuid.uuid4() + self.add((velocity, CMSO.hasIdentifier, Literal(velocity_identifier, datatype=XSD.string))) if "forces" in self.sys.atoms.keys(): uname = None @@ -641,8 +645,9 @@ def add_atoms(self, name=None): force = BNode(uname) self.add((self.sample, CMSO.hasAttribute, force)) self.add((force, RDF.type, CMSO.AtomAttribute)) - self.add((force, CMSO.hasName, Literal('Force', data_type=XSD.string)) - self.add(()) + self.add((force, CMSO.hasName, Literal('Force', data_type=XSD.string))) + force_identifier = uuid.uuid4() + self.add((force, CMSO.hasIdentifier, Literal(force_identifier, datatype=XSD.string))) From 8e35a46e55b79c856479c86bf1756e9b6c5b3902 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 15:05:56 +0100 Subject: [PATCH 10/47] add unique identifier --- pyscal_rdf/graph.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 06b61c6..5fc247a 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -605,6 +605,9 @@ def add_atoms(self, name=None): Note that for the moment, we will dump the structures in a given folder, maybe this could be input from the Job class directly """ + #start a path to store the data + #samples are BNodes, so names may not be unique, therefore we create one + if "positions" in self.sys.atoms.keys(): uname = None if name is not None: From bc5084e57bdfaca46ff0b0a154fa6396750edb6e Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 15:11:10 +0100 Subject: [PATCH 11/47] update graph --- pyscal_rdf/graph.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 5fc247a..88b9f89 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -271,7 +271,9 @@ def add(self, triple): if str(triple[2].toPython()) != 'None': self.graph.add(triple) - def add_structure_to_graph(self, structure, names=True, name_index=None, format=None): + def add_structure_to_graph(self, structure, names=True, + name_index=None, + format=None): """ Add a given :py:class:`pyscal.core.System` to the Graph object @@ -286,6 +288,9 @@ def add_structure_to_graph(self, structure, names=True, name_index=None, format= Returns ------- None + + Notes + ----- """ self.process_structure(structure, format=format) #now add to graph @@ -607,7 +612,7 @@ def add_atoms(self, name=None): """ #start a path to store the data #samples are BNodes, so names may not be unique, therefore we create one - + if "positions" in self.sys.atoms.keys(): uname = None if name is not None: From b02e4dc5336c39783469f3632b5a418677b363eb Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 15:25:04 +0100 Subject: [PATCH 12/47] update graph for uriref prep --- pyscal_rdf/graph.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 88b9f89..de01457 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -271,7 +271,9 @@ def add(self, triple): if str(triple[2].toPython()) != 'None': self.graph.add(triple) - def add_structure_to_graph(self, structure, names=True, + def add_structure_to_graph(self, + structure, + names=True, name_index=None, format=None): """ @@ -291,17 +293,31 @@ def add_structure_to_graph(self, structure, names=True, Notes ----- + BNodes, or relational nodes will be avoided as much as possible so that merging of datasets would be possible. + Instead URIref containers will be made use of. This makes the `names` and `name_index` parameters crucial. + `names` parameter means that legible names starting with the string `Sample_x` would be used. `x` would ensure + that there is conflict with the current database. However, they do not ensure there is no conflicts when various + graphs are merged together. Hence this value is recommended only for simple, demonstration cases. + + If `names` are False, unique ids are generated which would be id of the sample. These ids use the python `uuid` module + and therefore ensures that the names are always unique. """ + self.process_structure(structure, format=format) + #now add to graph if name_index is None: name_index = self.n_samples + 1 + self.create_graph(names=names, name_index=name_index) structure.sample = self.sample - structure._atom_ids = copy.copy(self._atom_ids) + #structure._atom_ids = copy.copy(self._atom_ids) structure.graph = self - def create_graph(self, names=False, name_index="1"): + def _generate_names(self, names=False, name_index=1): + pass + + def create_graph(self, names=False, name_index=1): """ Create the RDF Graph from the data stored @@ -330,6 +346,7 @@ def create_graph(self, names=False, name_index="1"): None, None, None, None, None, None] + self.add_sample(name=name_list[0]) self.add_material(name=name_list[1]) self.add_chemical_composition(name=name_list[2]) From 788e1278e95f618ff41e3357eb952d75d0bebda4 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 15:27:40 +0100 Subject: [PATCH 13/47] add skeleton for schema --- pyscal_rdf/rdfsystem.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pyscal_rdf/rdfsystem.py b/pyscal_rdf/rdfsystem.py index 35262da..9630289 100644 --- a/pyscal_rdf/rdfsystem.py +++ b/pyscal_rdf/rdfsystem.py @@ -1,5 +1,7 @@ import numpy as np import pyscal3.core as pc +from pyscal3.atoms import AttrSetter + from rdflib import Graph, Literal, Namespace, XSD, RDF, RDFS, BNode, URIRef, FOAF, SKOS, DCTERMS CMSO = Namespace("https://purls.helmholtz-metadaten.de/cmso/") @@ -25,6 +27,13 @@ def __init__(self, filename = None, if source is not None: self.__dict__.update(source.__dict__) + #assign attributes + self.schema = AttrSetter() + mapdict = {} + + self.schema._add_attribute(mapdict) + + def __delitem__(self, val): if isinstance(val, int): val = [val] From f74ae596eefb34aea6428656992f7042a425268a Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 16:35:01 +0100 Subject: [PATCH 14/47] overhaul properties --- pyscal_rdf/properties.py | 165 +++++++++++++++++++++++++++++---------- 1 file changed, 122 insertions(+), 43 deletions(-) diff --git a/pyscal_rdf/properties.py b/pyscal_rdf/properties.py index 4ebd1ee..c7ab86a 100644 --- a/pyscal_rdf/properties.py +++ b/pyscal_rdf/properties.py @@ -1,7 +1,122 @@ import numpy as np import spglib -def get_angle(vec1, vec2): +# DATADICT properties +#------------------------------------------ +bravais_lattice_dict = { + "l12": "https://www.wikidata.org/wiki/Q3006714", + "b2": "https://www.wikidata.org/wiki/Q851536", + "diamond": "https://www.wikidata.org/wiki/Q3006714", + "hcp": "https://www.wikidata.org/wiki/Q663314", + "a15": "a15", + "bcc": "https://www.wikidata.org/wiki/Q851536", + "fcc": "https://www.wikidata.org/wiki/Q3006714", +} + +# SIMCELL properties +#-------------------------------------------- +def get_chemical_composition(system): + return system.composition + +def get_cell_volume(system): + return system.volume + +def get_number_of_atoms(system): + return system.natoms + +def get_simulation_cell_length(system): + return system.box_dimensions + +def get_simulation_cell_vector(system): + return system.box + +def get_simulation_cell_angle(system): + return [_get_angle(system.box[0], system.box[1]), + _get_angle(system.box[1], system.box[2]), + _get_angle(system.box[2], system.box[0])] + +# LATTICE properties +#-------------------------------------------- + +def get_lattice_angle(system): + if system._structure_dict is None: + return None + + return [_get_angle(system._structure_dict["box"][0], system._structure_dict["box"][1]), + _get_angle(system._structure_dict["box"][1], system._structure_dict["box"][2]), + _get_angle(system._structure_dict["box"][2], system._structure_dict["box"][0])] + +def get_lattice_parameter(system): + if system.atoms._lattice_constant is None: + return [None, None, None] + else: + if system._structure_dict is not None: + return [np.linalg.norm(system._structure_dict["box"][0])*system.atoms._lattice_constant, + np.linalg.norm(system._structure_dict["box"][1])*system.atoms._lattice_constant, + np.linalg.norm(system._structure_dict["box"][2])*system.atoms._lattice_constant] + else: + return [system.atoms._lattice_constant, + system.atoms._lattice_constant, + system.atoms._lattice_constant] + +def get_crystal_structure_name(system): + if system._structure_dict is None: + return None + return system.atoms._lattice + +def get_bravais_lattice(system): + if system._structure_dict is None: + return None + if system.atoms._lattice in bravais_lattice_dict.keys(): + return bravais_lattice_dict[system.atoms._lattice] + return None + +def get_basis_positions(system): + if system._structure_dict is None: + return None + return system._structure_dict["positions"] + +def get_basis_occupancy(system): + if system._structure_dict is None: + return None + occ_numbers = system._structure_dict['species'] + tdict = system.atoms._type_dict + vals = [val for key, val in tdict.items()] + + if vals[0] is not None: + occ_numbers = [tdict[x] for x in occ_numbers] + return occ_numbers + +def get_lattice_vectors(system): + if system._structure_dict is None: + return None + return system._structure_dict["box"] + +def get_spacegroup_symbol(system): + if system._structure_dict is None: + return None + results = _get_symmetry_dict(system) + return results["international"] + +def get_spacegroup_number(system): + if system._structure_dict is None: + return None + results = _get_symmetry_dict(system) + return results["number"] + +# ATOM attributes +#-------------------------------------------- +def get_position(system): + return system.atoms.position + +def get_species(system): + return system.atoms.species + + + +# SUPPORT functions +#-------------------------------------------- +def _get_angle(vec1, vec2): """ Get angle between two vectors in degrees @@ -25,50 +140,14 @@ def get_angle(vec1, vec2): """ return np.round(np.arccos(np.dot(vec1, vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2)))*180/np.pi, decimals=2) -def get_coordination(sys): - sys.find.neighbors(method="cutoff") - coordination = [len(x) for x in sys.atoms.neighbors.index] - return coordination - -def get_lattice_vector(sys, cartesian=False): - box = sys.box - return box - -def get_bravais_lattice(sys): - lattice = sys.atoms._lattice - if lattice == "l12": - lattice = "https://www.wikidata.org/wiki/Q3006714" - elif lattice == "b2": - lattice = "https://www.wikidata.org/wiki/Q851536" - elif lattice == "diamond": - lattice = "https://www.wikidata.org/wiki/Q3006714" - elif lattice == "hcp": - lattice = "https://www.wikidata.org/wiki/Q663314" - elif lattice == "a15": - lattice = "a15" - elif lattice == "bcc": - lattice = "https://www.wikidata.org/wiki/Q851536" - elif lattice == "fcc": - lattice = "https://www.wikidata.org/wiki/Q3006714" - return lattice - -def get_space_group(sys): - box = get_lattice_vector(sys) - direct_coordinates = sys._structure_dict['positions'] - atom_types = sys._structure_dict['species'] +def _get_symmetry_dict(system): + box = get_lattice_vector(system) + direct_coordinates = get_basis_positions(system) + atom_types = system._structure_dict['species'] + results = spglib.get_symmetry_dataset((box, direct_coordinates, atom_types)) - return results["international"], results["number"] - -def get_basis(sys): - occ_numbers = sys._structure_dict['species'] - tdict = sys.atoms._type_dict - vals = [val for key, val in tdict.items()] - - if vals[0] is not None: - occ_numbers = [tdict[x] for x in occ_numbers] - return occ_numbers - + return results["international"], results["number"] From 90842c596c5e205951962ab544ed596c6719d325 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 17:00:34 +0100 Subject: [PATCH 15/47] add better data access --- pyscal_rdf/properties.py | 3 --- pyscal_rdf/rdfsystem.py | 30 +++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/pyscal_rdf/properties.py b/pyscal_rdf/properties.py index c7ab86a..5253b51 100644 --- a/pyscal_rdf/properties.py +++ b/pyscal_rdf/properties.py @@ -148,6 +148,3 @@ def _get_symmetry_dict(system): results = spglib.get_symmetry_dataset((box, direct_coordinates, atom_types)) return results["international"], results["number"] - - - diff --git a/pyscal_rdf/rdfsystem.py b/pyscal_rdf/rdfsystem.py index 9630289..ebd432b 100644 --- a/pyscal_rdf/rdfsystem.py +++ b/pyscal_rdf/rdfsystem.py @@ -1,6 +1,9 @@ import numpy as np +from functools import partial, update_wrapper + import pyscal3.core as pc from pyscal3.atoms import AttrSetter +import pyscal_rdf.properties as prp from rdflib import Graph, Literal, Namespace, XSD, RDF, RDFS, BNode, URIRef, FOAF, SKOS, DCTERMS @@ -29,7 +32,32 @@ def __init__(self, filename = None, #assign attributes self.schema = AttrSetter() - mapdict = {} + mapdict = { + "material": { + "element_ratio": partial(prp.get_chemical_composition, self), + "crystal_structure": { + "name": partial(prp.get_crystal_structure_name, self), + "spacegroup_symbol": partial(prp.get_spacegroup_symbol, self), + "spacegroup_number": partial(prp.get_spacegroup_number, self), + "unit_cell": { + "bravais_lattice": partial(prp.get_bravais_lattice, self), + "lattice_parameter": partial(prp.get_lattice_parameter, self), + "angle": partial(prp.get_lattice_angle, self), + }, + }, + }, + "simulation_cell": { + "volume": partial(prp.get_cell_volume, self), + "number_of_atoms": partial(prp.get_number_of_atoms, self), + "length": partial(prp.get_simulation_cell_length, self), + "vector": partial(prp.get_simulation_cell_vector, self), + "angle": partial(prp.get_simulation_cell_angle, self), + }, + "atom_attribute": { + "position": partial(prp.get_position, self), + "species": partial(prp.get_species, self), + }, + } self.schema._add_attribute(mapdict) From 21121f9f497a37435f4a3585f1041a1067a0c706 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 17:33:08 +0100 Subject: [PATCH 16/47] remove data --- pyscal_rdf/graph.py | 255 ++++++++++++++------------------------------ 1 file changed, 78 insertions(+), 177 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index de01457..5a89ae1 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -147,126 +147,12 @@ def process_structure(self, structure, format=None): """ if isinstance(structure, System): #self.sysdict = convert_to_dict(structure) - self.sys = structure + self.system = structure elif os.path.exists(structure): sys = System(structure, format=format) #self.sysdict = convert_to_dict(sys) - self.sys = sys - - def data(self, key): - #this method gets info directly from the dict - if key=="ChemicalComposition": - return self.sys.composition - elif key=="CellVolume": - return self.sys.volume - elif key=="NumberOfAtoms": - return self.sys.natoms - elif key=="SimulationCellLengthX": - return self.sys.box_dimensions[0] - elif key=="SimulationCellLengthY": - return self.sys.box_dimensions[1] - elif key=="SimulationCellLengthZ": - return self.sys.box_dimensions[2] - - elif key=="SimulationCellVectorA": - return self.sys.box[0] - elif key=="SimulationCellVectorB": - return self.sys.box[1] - elif key=="SimulationCellVectorC": - return self.sys.box[2] - - elif key=="SimulationCellAngleAlpha": - return prp.get_angle(self.sys.box[0], self.sys.box[1]) - elif key=="SimulationCellAngleBeta": - return prp.get_angle(self.sys.box[1], self.sys.box[2]) - elif key=="SimulationCellAngleGamma": - return prp.get_angle(self.sys.box[2], self.sys.box[0]) - - elif key=="LatticeAngleAlpha": - if self.sys._structure_dict is not None: - return prp.get_angle(self.sys._structure_dict["box"][0], self.sys._structure_dict["box"][1]) - return None - elif key=="LatticeAngleBeta": - if self.sys._structure_dict is not None: - return prp.get_angle(self.sys._structure_dict["box"][1], self.sys._structure_dict["box"][2]) - return None - elif key=="LatticeAngleGamma": - if self.sys._structure_dict is not None: - return prp.get_angle(self.sys._structure_dict["box"][2], self.sys._structure_dict["box"][0]) - return None - - elif key=="Element": - if self.sys.atoms.species[0] is not None: - return self.sys.atoms.species - else: - return self.sys.atoms.types - - elif key=="Coordination": - return prp.get_coordination(self.sys) + self.system = sys - elif key=="Positions": - return self.sys.atoms.positions - - elif key=="LatticeParameter": - if self.sys.atoms._lattice_constant is None: - return [None, None, None] - else: - if self.sys._structure_dict is not None: - return [np.linalg.norm(self.sys._structure_dict["box"][0])*self.sys.atoms._lattice_constant, - np.linalg.norm(self.sys._structure_dict["box"][1])*self.sys.atoms._lattice_constant, - np.linalg.norm(self.sys._structure_dict["box"][2])*self.sys.atoms._lattice_constant] - else: - return [self.sys.atoms._lattice_constant, - self.sys.atoms._lattice_constant, - self.sys.atoms._lattice_constant] - - elif key=="SpaceGroupSymbol": - if self.sys._structure_dict is not None: - symbol, number = prp.get_space_group(self.sys) - return symbol - - elif key=="SpaceGroupNumber": - if self.sys._structure_dict is not None: - symbol, number = prp.get_space_group(self.sys) - return number - else: - return None - - elif key=="CrystalStructureName": - if self.sys._structure_dict is not None: - return self.sys.atoms._lattice - else: - return None - - elif key=="BravaisLattice": - if self.sys._structure_dict is not None: - return prp.get_bravais_lattice(self.sys) - else: - return None - - elif key=="BasisPositions": - if self.sys._structure_dict is not None: - return self.sys._structure_dict['positions'] - else: - return None - - elif key=="BasisOccupancy": - if self.sys._structure_dict is not None: - return prp.get_basis(self.sys) - else: - return None - - elif key=="LatticeVectors": - if self.sys._structure_dict is not None: - return self.sys_structure_dict["box"] - else: - return None - - #if self.sysdict is not None: - # if key in self.sysdict: - # return self.sysdict[key] - return None - def add(self, triple): if str(triple[2].toPython()) != 'None': self.graph.add(triple) @@ -385,9 +271,9 @@ def add_sample(self, name=None): ------- """ - sample_01 = BNode(name) - self.add((sample_01, RDF.type, CMSO.AtomicScaleSample)) - self.sample = sample_01 + sample = BNode(name) + self.add((sample, RDF.type, CMSO.AtomicScaleSample)) + self.sample = sample def add_material(self, name=None): """ @@ -402,10 +288,10 @@ def add_material(self, name=None): ------- """ - material_01 = BNode(name) - self.add((self.sample, CMSO.hasMaterial, material_01)) - self.add((material_01, RDF.type, CMSO.CrystallineMaterial)) - self.material = material_01 + material = BNode(name) + self.add((self.sample, CMSO.hasMaterial, material)) + self.add((material, RDF.type, CMSO.CrystallineMaterial)) + self.material = material def add_chemical_composition(self, name=None): """ @@ -419,7 +305,7 @@ def add_chemical_composition(self, name=None): Returns ------- """ - composition = self.data("ChemicalComposition") + composition = self.system.schema.material.element_ratio() chemical_species = BNode(name) self.add((self.sample, CMSO.hasSpecies, chemical_species)) @@ -444,12 +330,16 @@ def add_simulation_cell(self, name=None): ------- """ - simulation_cell_01 = BNode(name) - self.add((self.sample, CMSO.hasSimulationCell, simulation_cell_01)) - self.add((simulation_cell_01, RDF.type, CMSO.SimulationCell)) - self.add((simulation_cell_01, CMSO.hasVolume, Literal(np.round(self.data("CellVolume"), decimals=2), datatype=XSD.float))) - self.add((self.sample, CMSO.hasNumberOfAtoms, Literal(self.data("NumberOfAtoms"), datatype=XSD.integer))) - self.simulation_cell = simulation_cell_01 + simulation_cell = BNode(name) + self.add((self.sample, CMSO.hasSimulationCell, simulation_cell)) + self.add((simulation_cell, RDF.type, CMSO.SimulationCell)) + self.add((simulation_cell, CMSO.hasVolume, + Literal(np.round(self.system.schema.simulation_cell.volume(), decimals=2), + datatype=XSD.float))) + self.add((self.sample, CMSO.hasNumberOfAtoms, + Literal(self.system.schema.simulation_cell.number_of_atoms(), + datatype=XSD.integer))) + self.simulation_cell = simulation_cell def add_simulation_cell_properties(self, name=None): @@ -469,22 +359,24 @@ def add_simulation_cell_properties(self, name=None): uname = None if name is not None: uname = f'{name}Length' - simulation_cell_length_01 = BNode(uname) - self.add((self.simulation_cell, CMSO.hasLength, simulation_cell_length_01)) - self.add((simulation_cell_length_01, RDF.type, CMSO.SimulationCellLength)) - self.add((simulation_cell_length_01, CMSO.hasLength_x, Literal(self.data("SimulationCellLengthX"), datatype=XSD.float))) - self.add((simulation_cell_length_01, CMSO.hasLength_y, Literal(self.data("SimulationCellLengthY"), datatype=XSD.float))) - self.add((simulation_cell_length_01, CMSO.hasLength_z, Literal(self.data("SimulationCellLengthZ"), datatype=XSD.float))) + simulation_cell_length = BNode(uname) + self.add((self.simulation_cell, CMSO.hasLength, simulation_cell_length)) + data = self.system.schema.simulation_cell.length() + self.add((simulation_cell_length, RDF.type, CMSO.SimulationCellLength)) + self.add((simulation_cell_length, CMSO.hasLength_x, Literal(data[0], datatype=XSD.float))) + self.add((simulation_cell_length, CMSO.hasLength_y, Literal(data[1], datatype=XSD.float))) + self.add((simulation_cell_length, CMSO.hasLength_z, Literal(data[2], datatype=XSD.float))) uname = None if name is not None: uname = f'{name}Vector01' simulation_cell_vector_01 = BNode(uname) + data = self.system.schema.simulation_cell.vector() self.add((self.simulation_cell, CMSO.hasVector, simulation_cell_vector_01)) self.add((simulation_cell_vector_01, RDF.type, CMSO.SimulationCellVector)) - self.add((simulation_cell_vector_01, CMSO.hasComponent_x, Literal(self.data("SimulationCellVectorA")[0], datatype=XSD.float))) - self.add((simulation_cell_vector_01, CMSO.hasComponent_y, Literal(self.data("SimulationCellVectorA")[1], datatype=XSD.float))) - self.add((simulation_cell_vector_01, CMSO.hasComponent_z, Literal(self.data("SimulationCellVectorA")[2], datatype=XSD.float))) + self.add((simulation_cell_vector_01, CMSO.hasComponent_x, Literal(data[0][0], datatype=XSD.float))) + self.add((simulation_cell_vector_01, CMSO.hasComponent_y, Literal(data[0][1], datatype=XSD.float))) + self.add((simulation_cell_vector_01, CMSO.hasComponent_z, Literal(data[0][2], datatype=XSD.float))) uname = None if name is not None: @@ -492,9 +384,9 @@ def add_simulation_cell_properties(self, name=None): simulation_cell_vector_02 = BNode(uname) self.add((self.simulation_cell, CMSO.hasVector, simulation_cell_vector_02)) self.add((simulation_cell_vector_02, RDF.type, CMSO.SimulationCellVector)) - self.add((simulation_cell_vector_02, CMSO.hasComponent_x, Literal(self.data("SimulationCellVectorB")[0], datatype=XSD.float))) - self.add((simulation_cell_vector_02, CMSO.hasComponent_y, Literal(self.data("SimulationCellVectorB")[1], datatype=XSD.float))) - self.add((simulation_cell_vector_02, CMSO.hasComponent_z, Literal(self.data("SimulationCellVectorB")[2], datatype=XSD.float))) + self.add((simulation_cell_vector_02, CMSO.hasComponent_x, Literal(data[1][0], datatype=XSD.float))) + self.add((simulation_cell_vector_02, CMSO.hasComponent_y, Literal(data[1][1], datatype=XSD.float))) + self.add((simulation_cell_vector_02, CMSO.hasComponent_z, Literal(data[1][2], datatype=XSD.float))) uname = None if name is not None: @@ -502,19 +394,20 @@ def add_simulation_cell_properties(self, name=None): simulation_cell_vector_03 = BNode(uname) self.add((self.simulation_cell, CMSO.hasVector, simulation_cell_vector_03)) self.add((simulation_cell_vector_03, RDF.type, CMSO.SimulationCellVector)) - self.add((simulation_cell_vector_03, CMSO.hasComponent_x, Literal(self.data("SimulationCellVectorC")[0], datatype=XSD.float))) - self.add((simulation_cell_vector_03, CMSO.hasComponent_y, Literal(self.data("SimulationCellVectorC")[1], datatype=XSD.float))) - self.add((simulation_cell_vector_03, CMSO.hasComponent_z, Literal(self.data("SimulationCellVectorC")[2], datatype=XSD.float))) + self.add((simulation_cell_vector_03, CMSO.hasComponent_x, Literal(data[2][0], datatype=XSD.float))) + self.add((simulation_cell_vector_03, CMSO.hasComponent_y, Literal(data[2][1], datatype=XSD.float))) + self.add((simulation_cell_vector_03, CMSO.hasComponent_z, Literal(data[2][2], datatype=XSD.float))) uname = None if name is not None: uname = f'{name}Angle' - simulation_cell_angle_01 = BNode(uname) - self.add((self.simulation_cell, CMSO.hasAngle, simulation_cell_angle_01)) - self.add((simulation_cell_angle_01, RDF.type, CMSO.SimulationCellAngle)) - self.add((simulation_cell_angle_01, CMSO.hasAngle_alpha, Literal(self.data("SimulationCellAngleAlpha"), datatype=XSD.float))) - self.add((simulation_cell_angle_01, CMSO.hasAngle_beta, Literal(self.data("SimulationCellAngleBeta"), datatype=XSD.float))) - self.add((simulation_cell_angle_01, CMSO.hasAngle_gamma, Literal(self.data("SimulationCellAngleGamma"), datatype=XSD.float))) + simulation_cell_angle = BNode(uname) + data = self.system.schema.simulation_cell.angle() + self.add((self.simulation_cell, CMSO.hasAngle, simulation_cell_angle)) + self.add((simulation_cell_angle, RDF.type, CMSO.SimulationCellAngle)) + self.add((simulation_cell_angle, CMSO.hasAngle_alpha, Literal(data[0], datatype=XSD.float))) + self.add((simulation_cell_angle, CMSO.hasAngle_beta, Literal(data[1], datatype=XSD.float))) + self.add((simulation_cell_angle, CMSO.hasAngle_gamma, Literal(data[2], datatype=XSD.float))) def add_crystal_structure(self, name=None): @@ -530,11 +423,13 @@ def add_crystal_structure(self, name=None): ------- """ - crystal_structure_01 = BNode(name) - self.add((self.material, CMSO.hasStructure, crystal_structure_01)) - self.add((crystal_structure_01, RDF.type, CMSO.CrystalStructure)) - self.add((crystal_structure_01, CMSO.hasAltName, Literal(self.data("CrystalStructureName"), datatype=XSD.string))) - self.crystal_structure = crystal_structure_01 + crystal_structure = BNode(name) + self.add((self.material, CMSO.hasStructure, crystal_structure)) + self.add((crystal_structure, RDF.type, CMSO.CrystalStructure)) + self.add((crystal_structure, CMSO.hasAltName, + Literal(self.system.schema.material.crystal_structure.name(), + datatype=XSD.string))) + self.crystal_structure = crystal_structure def add_space_group(self, name=None): """ @@ -548,8 +443,12 @@ def add_space_group(self, name=None): Returns ------- """ - self.add((self.crystal_structure, CMSO.hasSpaceGroupSymbol, Literal(self.data("SpaceGroupSymbol"), datatype=XSD.string))) - self.add((self.crystal_structure, CMSO.hasSpaceGroupNumber, Literal(self.data("SpaceGroupNumber"), datatype=XSD.integer))) + self.add((self.crystal_structure, CMSO.hasSpaceGroupSymbol, + Literal(self.system.schema.material.crystal_structure.spacegroup_symbol(), + datatype=XSD.string))) + self.add((self.crystal_structure, CMSO.hasSpaceGroupNumber, + Literal(self.system.schema.material.crystal_structure.spacegroup_number(), + datatype=XSD.integer))) def add_unit_cell(self, name=None): @@ -565,15 +464,15 @@ def add_unit_cell(self, name=None): ------- """ - unit_cell_01 = BNode(name) - self.add((self.crystal_structure, CMSO.hasUnitCell, unit_cell_01)) - self.add((unit_cell_01, RDF.type, CMSO.UnitCell)) - self.unit_cell = unit_cell_01 + unit_cell = BNode(name) + self.add((self.crystal_structure, CMSO.hasUnitCell, unit_cell)) + self.add((unit_cell, RDF.type, CMSO.UnitCell)) + self.unit_cell = unit_cell #add bravais lattice - bv = None - if self.data("BravaisLattice") is not None: - bv = URIRef(self.data("BravaisLattice")) + bv = self.system.schema.material.crystal_structure.unit_cell.bravais_lattice() + if bv is not None: + bv = URIRef(bv) self.add((self.unit_cell, CMSO.hasBravaisLattice, bv)) def add_lattice_properties(self, name=None): @@ -593,22 +492,24 @@ def add_lattice_properties(self, name=None): uname = None if name is not None: uname = f'{name}LatticeParameter' - lattice_parameter_01 = BNode(uname) - self.add((self.unit_cell, CMSO.hasLatticeParamter, lattice_parameter_01)) - self.add((lattice_parameter_01, RDF.type, CMSO.LatticeParameter)) - self.add((lattice_parameter_01, CMSO.hasLength_x, Literal(self.data("LatticeParameter")[0], datatype=XSD.float))) - self.add((lattice_parameter_01, CMSO.hasLength_y, Literal(self.data("LatticeParameter")[1], datatype=XSD.float))) - self.add((lattice_parameter_01, CMSO.hasLength_z, Literal(self.data("LatticeParameter")[2], datatype=XSD.float))) + data = self.system.schema.material.crystal_structure.unit_cell.lattice_parameter() + lattice_parameter = BNode(uname) + self.add((self.unit_cell, CMSO.hasLatticeParamter, lattice_parameter)) + self.add((lattice_parameter, RDF.type, CMSO.LatticeParameter)) + self.add((lattice_parameter, CMSO.hasLength_x, Literal(data[0], datatype=XSD.float))) + self.add((lattice_parameter, CMSO.hasLength_y, Literal(data[1], datatype=XSD.float))) + self.add((lattice_parameter, CMSO.hasLength_z, Literal(data[2], datatype=XSD.float))) uname = None if name is not None: uname = f'{name}LatticeAngle' - lattice_angle_01 = BNode(uname) - self.add((self.unit_cell, CMSO.hasAngle, lattice_angle_01)) - self.add((lattice_angle_01, RDF.type, CMSO.LatticeAngle)) - self.add((lattice_angle_01, CMSO.hasAngle_alpha, Literal(self.data("LatticeAngleAlpha"), datatype=XSD.float))) - self.add((lattice_angle_01, CMSO.hasAngle_beta, Literal(self.data("LatticeAngleBeta"), datatype=XSD.float))) - self.add((lattice_angle_01, CMSO.hasAngle_gamma, Literal(self.data("LatticeAngleGamma"), datatype=XSD.float))) + lattice_angle = BNode(uname) + data = self.system.schema.material.crystal_structure.unit_cell.angle() + self.add((self.unit_cell, CMSO.hasAngle, lattice_angle)) + self.add((lattice_angle, RDF.type, CMSO.LatticeAngle)) + self.add((lattice_angle, CMSO.hasAngle_alpha, Literal(data[0], datatype=XSD.float))) + self.add((lattice_angle, CMSO.hasAngle_beta, Literal(data[1], datatype=XSD.float))) + self.add((lattice_angle, CMSO.hasAngle_gamma, Literal(data[2], datatype=XSD.float))) def add_atoms(self, name=None): """ From adc5306bab1483118db2fef7ba1985dcc3e36f3f Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 17:35:12 +0100 Subject: [PATCH 17/47] further fixes to remove data --- pyscal_rdf/graph.py | 70 ++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 5a89ae1..c608147 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -553,27 +553,27 @@ def add_atoms(self, name=None): species_identifier = uuid.uuid4() self.add((species, CMSO.hasIdentifier, Literal(species_identifier, datatype=XSD.string))) - if "velocities" in self.sys.atoms.keys(): - uname = None - if name is not None: - uname = f'{name}_Velocity' - velocity = BNode(uname) - self.add((self.sample, CMSO.hasAttribute, velocity)) - self.add((velocity, RDF.type, CMSO.AtomAttribute)) - self.add((velocity, CMSO.hasName, Literal('Velocity', data_type=XSD.string))) - velocity_identifier = uuid.uuid4() - self.add((velocity, CMSO.hasIdentifier, Literal(velocity_identifier, datatype=XSD.string))) - - if "forces" in self.sys.atoms.keys(): - uname = None - if name is not None: - uname = f'{name}_Force' - force = BNode(uname) - self.add((self.sample, CMSO.hasAttribute, force)) - self.add((force, RDF.type, CMSO.AtomAttribute)) - self.add((force, CMSO.hasName, Literal('Force', data_type=XSD.string))) - force_identifier = uuid.uuid4() - self.add((force, CMSO.hasIdentifier, Literal(force_identifier, datatype=XSD.string))) + #if "velocities" in self.sys.atoms.keys(): + # uname = None + # if name is not None: + # uname = f'{name}_Velocity' + # velocity = BNode(uname) + # self.add((self.sample, CMSO.hasAttribute, velocity)) + # self.add((velocity, RDF.type, CMSO.AtomAttribute)) + # self.add((velocity, CMSO.hasName, Literal('Velocity', data_type=XSD.string))) + # velocity_identifier = uuid.uuid4() + # self.add((velocity, CMSO.hasIdentifier, Literal(velocity_identifier, datatype=XSD.string))) + + #if "forces" in self.sys.atoms.keys(): + # uname = None + # if name is not None: + # uname = f'{name}_Force' + # force = BNode(uname) + # self.add((self.sample, CMSO.hasAttribute, force)) + # self.add((force, RDF.type, CMSO.AtomAttribute)) + # self.add((force, CMSO.hasName, Literal('Force', data_type=XSD.string))) + # force_identifier = uuid.uuid4() + # self.add((force, CMSO.hasIdentifier, Literal(force_identifier, datatype=XSD.string))) @@ -596,27 +596,27 @@ def add_gb(self, gb_dict, name=None): #mark that the structure has a defect - plane_defect_01 = BNode(name) - self.add((self.material, CMSO.hasDefect, plane_defect_01)) + plane_defect = BNode(name) + self.add((self.material, CMSO.hasDefect, plane_defect)) if gb_dict["GBType"] is None: - self.add((plane_defect_01, RDF.type, PLDO.GrainBoundary)) + self.add((plane_defect, RDF.type, PLDO.GrainBoundary)) elif gb_dict["GBType"] == "Twist": - self.add((plane_defect_01, RDF.type, PLDO.TwistGrainBoundary)) + self.add((plane_defect, RDF.type, PLDO.TwistGrainBoundary)) elif gb_dict["GBType"] == "Tilt": - self.add((plane_defect_01, RDF.type, PLDO.TiltGrainBoundary)) + self.add((plane_defect, RDF.type, PLDO.TiltGrainBoundary)) elif gb_dict["GBType"] == "Symmetric Tilt": - self.add((plane_defect_01, RDF.type, PLDO.SymmetricalTiltGrainBoundary)) + self.add((plane_defect, RDF.type, PLDO.SymmetricalTiltGrainBoundary)) elif gb_dict["GBType"] == "Mixed": - self.add((plane_defect_01, RDF.type, PLDO.MixedGrainBoundary)) - self.add((plane_defect_01, PLDO.hasSigmaValue, Literal(gb_dict["sigma"], datatype=XSD.integer))) + self.add((plane_defect, RDF.type, PLDO.MixedGrainBoundary)) + self.add((plane_defect, PLDO.hasSigmaValue, Literal(gb_dict["sigma"], datatype=XSD.integer))) #now mark that the defect is GB #uname = None #if name is not None: # uname = f'{name}GrainBoundaryPlane' #gb_plane_01 = BNode(uname) - self.add((plane_defect_01, PLDO.hasGBPlane, Literal(gb_dict["GBPlane"], + self.add((plane_defect, PLDO.hasGBPlane, Literal(gb_dict["GBPlane"], datatype=XSD.string))) #self.add((gb_plane_01, RDF.type, PLDO.GrainBoundaryPlane)) #self.add((gb_plane_01, PLDO.hasMillerIndices, Literal(gb_dict["GBPlane"], @@ -626,7 +626,7 @@ def add_gb(self, gb_dict, name=None): #if name is not None: # uname = f'{name}RotationAxis' #rotation_axis_01 = BNode(uname) - self.add((plane_defect_01, PLDO.hasRotationAxis, Literal(gb_dict["RotationAxis"], + self.add((plane_defect, PLDO.hasRotationAxis, Literal(gb_dict["RotationAxis"], datatype=XSD.string))) #self.add((rotation_axis_01, RDF.type, PLDO.RotationAxis)) #self.add((rotation_axis_01, PLDO.hasComponentX, Literal(gb_dict["RotationAxis"][0], datatype=XSD.float))) @@ -637,7 +637,7 @@ def add_gb(self, gb_dict, name=None): #if name is not None: # uname = f'{name}MisorientationAngle' #misorientation_angle_01 = BNode(uname) - self.add((plane_defect_01, PLDO.hasMisorientationAngle, Literal(gb_dict["MisorientationAngle"], datatype=XSD.float))) + self.add((plane_defect, PLDO.hasMisorientationAngle, Literal(gb_dict["MisorientationAngle"], datatype=XSD.float))) #self.add((misorientation_angle_01, RDF.type, PLDO.MisorientationAngle)) #self.add((misorientation_angle_01, PLDO.hasAngle, Literal(gb_dict["MisorientationAngle"], datatype=XSD.float))) @@ -657,9 +657,9 @@ def add_vacancy(self, concentration, number=None, name=None): ------- """ - vacancy_01 = BNode(name) - self.add((self.material, CMSO.hasDefect, vacancy_01)) - self.add((vacancy_01, RDF.type, PODO.Vacancy)) + vacancy = BNode(name) + self.add((self.material, CMSO.hasDefect, vacancy)) + self.add((vacancy, RDF.type, PODO.Vacancy)) self.add((self.simulation_cell, PODO.hasVacancyConcentration, Literal(concentration, datatype=XSD.float))) if number is not None: self.add((self.simulation_cell, PODO.hasNumberOfVacancies, Literal(number, datatype=XSD.integer))) From 3eed167fbaf3a2d9e2cf63f5e0433aa8fba2bbd8 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 17:47:17 +0100 Subject: [PATCH 18/47] fix minor bugs --- pyscal_rdf/graph.py | 12 +++++++----- pyscal_rdf/properties.py | 6 +++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index c608147..0f96df1 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -111,7 +111,7 @@ def __init__(self, graph_file=None, raise ValueError("store should be pyiron_project, SQLAlchemy, or Memory") #start the storage - _set_structure_store(self.structure_store) + _setup_structure_store(self.structure_store) #start binding self.graph.bind("cmso", CMSO) @@ -314,6 +314,8 @@ def add_chemical_composition(self, name=None): for e, r in composition.keys(): if e in element_indetifiers.keys(): element = URIRef(element_indetifiers[e]) + self.add((chemical_species, CMSO.hasElement, element)) + self.add((element, RDF.type, CMSO.Element)) self.add((element, CMSO.hasSymbol, Literal(e, datatype=XSD.string))) self.add((element, CMSO.hasElementRatio, Literal(r, datatype=XSD.float))) @@ -531,25 +533,25 @@ def add_atoms(self, name=None): #start a path to store the data #samples are BNodes, so names may not be unique, therefore we create one - if "positions" in self.sys.atoms.keys(): + if "positions" in self.system.atoms.keys(): uname = None if name is not None: uname = f'{name}_Position' position = BNode(uname) self.add((self.sample, CMSO.hasAttribute, position)) self.add((position, RDF.type, CMSO.AtomAttribute)) - self.add((position, CMSO.hasName, Literal('Position', data_type=XSD.string))) + self.add((position, CMSO.hasName, Literal('Position', datatype=XSD.string))) position_identifier = uuid.uuid4() self.add((position, CMSO.hasIdentifier, Literal(position_identifier, datatype=XSD.string))) - if "species" in self.sys.atoms.keys(): + if "species" in self.system.atoms.keys(): uname = None if name is not None: uname = f'{name}_Species' species = BNode(uname) self.add((self.sample, CMSO.hasAttribute, species)) self.add((species, RDF.type, CMSO.AtomAttribute)) - self.add((species, CMSO.hasName, Literal('Species', data_type=XSD.string))) + self.add((species, CMSO.hasName, Literal('Species', datatype=XSD.string))) species_identifier = uuid.uuid4() self.add((species, CMSO.hasIdentifier, Literal(species_identifier, datatype=XSD.string))) diff --git a/pyscal_rdf/properties.py b/pyscal_rdf/properties.py index 5253b51..8e54c8a 100644 --- a/pyscal_rdf/properties.py +++ b/pyscal_rdf/properties.py @@ -87,7 +87,7 @@ def get_basis_occupancy(system): occ_numbers = [tdict[x] for x in occ_numbers] return occ_numbers -def get_lattice_vectors(system): +def get_lattice_vector(system): if system._structure_dict is None: return None return system._structure_dict["box"] @@ -96,13 +96,13 @@ def get_spacegroup_symbol(system): if system._structure_dict is None: return None results = _get_symmetry_dict(system) - return results["international"] + return results[0] def get_spacegroup_number(system): if system._structure_dict is None: return None results = _get_symmetry_dict(system) - return results["number"] + return results[1] # ATOM attributes #-------------------------------------------- From 05f62611d0913d619d1366700a21189991b01437 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 18:45:00 +0100 Subject: [PATCH 19/47] update graphs --- pyscal_rdf/data/element.yml | 6 +++--- pyscal_rdf/graph.py | 4 ++-- pyscal_rdf/visualize.py | 23 +++++++++++++++++------ 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/pyscal_rdf/data/element.yml b/pyscal_rdf/data/element.yml index 271fa97..577984e 100644 --- a/pyscal_rdf/data/element.yml +++ b/pyscal_rdf/data/element.yml @@ -12,9 +12,9 @@ Co: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:27638 Cr: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28073 Cs: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30514 Cu: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:28694 -Dy: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=33377 -Er: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=33379 -Eu: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=32999 +Dy: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33377 +Er: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33379 +Eu: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:32999 Fe: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:18248 Gd: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:33375 Ge: https://www.ebi.ac.uk/chebi/searchId.do?chebiId=CHEBI:30441 diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 0f96df1..4cf55b4 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -310,8 +310,8 @@ def add_chemical_composition(self, name=None): chemical_species = BNode(name) self.add((self.sample, CMSO.hasSpecies, chemical_species)) self.add((chemical_species, RDF.type, CMSO.ChemicalSpecies)) - - for e, r in composition.keys(): + + for e, r in composition.items(): if e in element_indetifiers.keys(): element = URIRef(element_indetifiers[e]) self.add((chemical_species, CMSO.hasElement, element)) diff --git a/pyscal_rdf/visualize.py b/pyscal_rdf/visualize.py index beac451..26252e5 100644 --- a/pyscal_rdf/visualize.py +++ b/pyscal_rdf/visualize.py @@ -8,12 +8,23 @@ def get_title_from_BNode(x): return x.toPython() -def get_string_from_URI(x, ): - raw = x.toPython().split("#") - if len(raw)>1: - return raw[-1] - else: - return ".".join(x.toPython().split("/")[-2:]) +def get_string_from_URI(x): + raw = x.toPython() + #first try splitting by # + rawsplit = raw.split("#") + if len(rawsplit) > 1: + return rawsplit[-1] + #try splitting by = for chebi values + if 'CHEBI' in raw: + rawsplit = raw.split("=") + rawsplit = rawsplit[-1].split(":") + if len(rawsplit) > 1: + return ".".join(rawsplit[-2:]) + + #just a normal url split now + rawsplit = raw.split("/") + if len(rawsplit) > 1: + return ".".join(rawsplit[-2:]) def parse_object(x): if isinstance(x, BNode): From ae4362d9719ec1ce996b8f14b38a19dae6507aa6 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 19:00:15 +0100 Subject: [PATCH 20/47] remove names --- pyscal_rdf/graph.py | 57 +++++++++++++++++---------------------------- 1 file changed, 22 insertions(+), 35 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 4cf55b4..592e983 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -191,19 +191,19 @@ def add_structure_to_graph(self, self.process_structure(structure, format=format) - #now add to graph - if name_index is None: - name_index = self.n_samples + 1 - - self.create_graph(names=names, name_index=name_index) + if names: + if name_index is None: + name_index = self.n_samples + 1 + self._name = f'sample_{name_index}' + else: + self._name = uuid.uuid4() + + self.create_graph() structure.sample = self.sample #structure._atom_ids = copy.copy(self._atom_ids) structure.graph = self - def _generate_names(self, names=False, name_index=1): - pass - - def create_graph(self, names=False, name_index=1): + def create_graph(self): """ Create the RDF Graph from the data stored @@ -218,32 +218,19 @@ def create_graph(self, names=False, name_index=1): Returns ------- None - """ - - if names: - name_list = [f'Sample_{name_index}', f'Material_{name_index}', - f'ChemicalComposition_{name_index}', f'SimulationCell_{name_index}', - f'SimulationCell_{name_index}', f'CrystalStructure_{name_index}', - f'SpaceGroup_{name_index}', f'UnitCell_{name_index}', - f'UnitCell_{name_index}', f'Atom_{name_index}'] - else: - name_list = [None, None, - None, None, - None, None, - None, None, - None, None] - - self.add_sample(name=name_list[0]) - self.add_material(name=name_list[1]) - self.add_chemical_composition(name=name_list[2]) - self.add_simulation_cell(name=name_list[3]) - self.add_simulation_cell_properties(name=name_list[4]) - self.add_crystal_structure(name=name_list[5]) - self.add_space_group(name=name_list[6]) - self.add_unit_cell(name=name_list[7]) - self.add_lattice_properties(name=name_list[8]) - self.add_atoms(name=name_list[9]) - + """ + self.add_sample() + self.add_material() + self.add_chemical_composition() + self.add_simulation_cell() + self.add_simulation_cell_properties() + self.add_crystal_structure() + self.add_space_group() + self.add_unit_cell() + self.add_lattice_properties() + self.add_atoms() + + #extra triples self.add((CMSO.SimulationCellLength, RDFS.subClassOf, CMSO.Length)) self.add((CMSO.LatticeParameter, RDFS.subClassOf, CMSO.Length)) self.add((CMSO.Length, CMSO.hasUnit, URIRef("https://qudt.org/2.1/vocab/unit#ANGSTROM"))) From bce40c2d57237f47760914d8e317d453a1000a64 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 19:14:31 +0100 Subject: [PATCH 21/47] remove BNodes --- pyscal_rdf/graph.py | 100 +++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 61 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 592e983..65bbc57 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -245,7 +245,7 @@ def create_graph(self): self.add((CMSO.Vector, CMSO.hasUnit, URIRef("https://qudt.org/2.1/vocab/unit#ANGSTROM"))) - def add_sample(self, name=None): + def add_sample(self): """ Add a CMSO Sample object @@ -262,7 +262,7 @@ def add_sample(self, name=None): self.add((sample, RDF.type, CMSO.AtomicScaleSample)) self.sample = sample - def add_material(self, name=None): + def add_material(self): """ Add a CMSO Material object @@ -280,7 +280,7 @@ def add_material(self, name=None): self.add((material, RDF.type, CMSO.CrystallineMaterial)) self.material = material - def add_chemical_composition(self, name=None): + def add_chemical_composition(self): """ Add chemical composition @@ -294,7 +294,7 @@ def add_chemical_composition(self, name=None): """ composition = self.system.schema.material.element_ratio() - chemical_species = BNode(name) + chemical_species = URIRef(f'{self._name}_ChemicalSpecies') self.add((self.sample, CMSO.hasSpecies, chemical_species)) self.add((chemical_species, RDF.type, CMSO.ChemicalSpecies)) @@ -306,7 +306,7 @@ def add_chemical_composition(self, name=None): self.add((element, CMSO.hasSymbol, Literal(e, datatype=XSD.string))) self.add((element, CMSO.hasElementRatio, Literal(r, datatype=XSD.float))) - def add_simulation_cell(self, name=None): + def add_simulation_cell(self): """ Add a CMSO SimulationCell @@ -319,7 +319,7 @@ def add_simulation_cell(self, name=None): ------- """ - simulation_cell = BNode(name) + simulation_cell = URIRef(f'{self._name}_SimulationCell') self.add((self.sample, CMSO.hasSimulationCell, simulation_cell)) self.add((simulation_cell, RDF.type, CMSO.SimulationCell)) self.add((simulation_cell, CMSO.hasVolume, @@ -331,7 +331,7 @@ def add_simulation_cell(self, name=None): self.simulation_cell = simulation_cell - def add_simulation_cell_properties(self, name=None): + def add_simulation_cell_properties(self): """ Add a CMSO SimulationCell properties such as SimulationCellLength, and Vectors. @@ -344,11 +344,7 @@ def add_simulation_cell_properties(self, name=None): Returns ------- """ - - uname = None - if name is not None: - uname = f'{name}Length' - simulation_cell_length = BNode(uname) + simulation_cell_length = URIRef(f'{self._name}_SimulationCellLength') self.add((self.simulation_cell, CMSO.hasLength, simulation_cell_length)) data = self.system.schema.simulation_cell.length() self.add((simulation_cell_length, RDF.type, CMSO.SimulationCellLength)) @@ -356,10 +352,7 @@ def add_simulation_cell_properties(self, name=None): self.add((simulation_cell_length, CMSO.hasLength_y, Literal(data[1], datatype=XSD.float))) self.add((simulation_cell_length, CMSO.hasLength_z, Literal(data[2], datatype=XSD.float))) - uname = None - if name is not None: - uname = f'{name}Vector01' - simulation_cell_vector_01 = BNode(uname) + simulation_cell_vector_01 = URIRef(f'{self._name}_SimulationCellVector_1') data = self.system.schema.simulation_cell.vector() self.add((self.simulation_cell, CMSO.hasVector, simulation_cell_vector_01)) self.add((simulation_cell_vector_01, RDF.type, CMSO.SimulationCellVector)) @@ -367,30 +360,21 @@ def add_simulation_cell_properties(self, name=None): self.add((simulation_cell_vector_01, CMSO.hasComponent_y, Literal(data[0][1], datatype=XSD.float))) self.add((simulation_cell_vector_01, CMSO.hasComponent_z, Literal(data[0][2], datatype=XSD.float))) - uname = None - if name is not None: - uname = f'{name}Vector02' - simulation_cell_vector_02 = BNode(uname) + simulation_cell_vector_02 = URIRef(f'{self._name}_SimulationCellVector_2') self.add((self.simulation_cell, CMSO.hasVector, simulation_cell_vector_02)) self.add((simulation_cell_vector_02, RDF.type, CMSO.SimulationCellVector)) self.add((simulation_cell_vector_02, CMSO.hasComponent_x, Literal(data[1][0], datatype=XSD.float))) self.add((simulation_cell_vector_02, CMSO.hasComponent_y, Literal(data[1][1], datatype=XSD.float))) self.add((simulation_cell_vector_02, CMSO.hasComponent_z, Literal(data[1][2], datatype=XSD.float))) - uname = None - if name is not None: - uname = f'{name}Vector03' - simulation_cell_vector_03 = BNode(uname) + simulation_cell_vector_03 = URIRef(f'{self._name}_SimulationCellVector_3') self.add((self.simulation_cell, CMSO.hasVector, simulation_cell_vector_03)) self.add((simulation_cell_vector_03, RDF.type, CMSO.SimulationCellVector)) self.add((simulation_cell_vector_03, CMSO.hasComponent_x, Literal(data[2][0], datatype=XSD.float))) self.add((simulation_cell_vector_03, CMSO.hasComponent_y, Literal(data[2][1], datatype=XSD.float))) self.add((simulation_cell_vector_03, CMSO.hasComponent_z, Literal(data[2][2], datatype=XSD.float))) - uname = None - if name is not None: - uname = f'{name}Angle' - simulation_cell_angle = BNode(uname) + simulation_cell_angle = URIRef(f'{self._name}_SimulationCellAngle') data = self.system.schema.simulation_cell.angle() self.add((self.simulation_cell, CMSO.hasAngle, simulation_cell_angle)) self.add((simulation_cell_angle, RDF.type, CMSO.SimulationCellAngle)) @@ -399,7 +383,7 @@ def add_simulation_cell_properties(self, name=None): self.add((simulation_cell_angle, CMSO.hasAngle_gamma, Literal(data[2], datatype=XSD.float))) - def add_crystal_structure(self, name=None): + def add_crystal_structure(self): """ Add a CMSO Crystal Structure @@ -412,7 +396,7 @@ def add_crystal_structure(self, name=None): ------- """ - crystal_structure = BNode(name) + crystal_structure = URIRef(f'{self._name}_CrystalStructure') self.add((self.material, CMSO.hasStructure, crystal_structure)) self.add((crystal_structure, RDF.type, CMSO.CrystalStructure)) self.add((crystal_structure, CMSO.hasAltName, @@ -420,7 +404,7 @@ def add_crystal_structure(self, name=None): datatype=XSD.string))) self.crystal_structure = crystal_structure - def add_space_group(self, name=None): + def add_space_group(self): """ Add a CMSO Space Group @@ -440,7 +424,7 @@ def add_space_group(self, name=None): datatype=XSD.integer))) - def add_unit_cell(self, name=None): + def add_unit_cell(self): """ Add a CMSO Unit Cell @@ -453,7 +437,7 @@ def add_unit_cell(self, name=None): ------- """ - unit_cell = BNode(name) + unit_cell = URIRef(f'{self._name}_UnitCell') self.add((self.crystal_structure, CMSO.hasUnitCell, unit_cell)) self.add((unit_cell, RDF.type, CMSO.UnitCell)) self.unit_cell = unit_cell @@ -464,7 +448,7 @@ def add_unit_cell(self, name=None): bv = URIRef(bv) self.add((self.unit_cell, CMSO.hasBravaisLattice, bv)) - def add_lattice_properties(self, name=None): + def add_lattice_properties(self): """ Add CMSO lattice properties such as Lattice Parameter, and its lengths and angles. @@ -477,22 +461,15 @@ def add_lattice_properties(self, name=None): Returns ------- """ - - uname = None - if name is not None: - uname = f'{name}LatticeParameter' data = self.system.schema.material.crystal_structure.unit_cell.lattice_parameter() - lattice_parameter = BNode(uname) + lattice_parameter = URIRef(f'{self._name}_LatticeParameter') self.add((self.unit_cell, CMSO.hasLatticeParamter, lattice_parameter)) self.add((lattice_parameter, RDF.type, CMSO.LatticeParameter)) self.add((lattice_parameter, CMSO.hasLength_x, Literal(data[0], datatype=XSD.float))) self.add((lattice_parameter, CMSO.hasLength_y, Literal(data[1], datatype=XSD.float))) self.add((lattice_parameter, CMSO.hasLength_z, Literal(data[2], datatype=XSD.float))) - uname = None - if name is not None: - uname = f'{name}LatticeAngle' - lattice_angle = BNode(uname) + lattice_angle = URIRef(f'{self._name}_LatticeAngle') data = self.system.schema.material.crystal_structure.unit_cell.angle() self.add((self.unit_cell, CMSO.hasAngle, lattice_angle)) self.add((lattice_angle, RDF.type, CMSO.LatticeAngle)) @@ -500,7 +477,7 @@ def add_lattice_properties(self, name=None): self.add((lattice_angle, CMSO.hasAngle_beta, Literal(data[1], datatype=XSD.float))) self.add((lattice_angle, CMSO.hasAngle_gamma, Literal(data[2], datatype=XSD.float))) - def add_atoms(self, name=None): + def add_atoms(self): """ Add Atoms including their species and positions @@ -521,10 +498,7 @@ def add_atoms(self, name=None): #samples are BNodes, so names may not be unique, therefore we create one if "positions" in self.system.atoms.keys(): - uname = None - if name is not None: - uname = f'{name}_Position' - position = BNode(uname) + position = URIRef(f'{self._name}_Position') self.add((self.sample, CMSO.hasAttribute, position)) self.add((position, RDF.type, CMSO.AtomAttribute)) self.add((position, CMSO.hasName, Literal('Position', datatype=XSD.string))) @@ -532,10 +506,7 @@ def add_atoms(self, name=None): self.add((position, CMSO.hasIdentifier, Literal(position_identifier, datatype=XSD.string))) if "species" in self.system.atoms.keys(): - uname = None - if name is not None: - uname = f'{name}_Species' - species = BNode(uname) + species = URIRef(f'{self._name}_Species') self.add((self.sample, CMSO.hasAttribute, species)) self.add((species, RDF.type, CMSO.AtomAttribute)) self.add((species, CMSO.hasName, Literal('Species', datatype=XSD.string))) @@ -567,7 +538,7 @@ def add_atoms(self, name=None): - def add_gb(self, gb_dict, name=None): + def add_gb(self, gb_dict): """ Add GB details which will be annotated using PLDO @@ -583,21 +554,28 @@ def add_gb(self, gb_dict, name=None): ------- """ - #mark that the structure has a defect - - plane_defect = BNode(name) - self.add((self.material, CMSO.hasDefect, plane_defect)) - + #mark that the structure has a defect if gb_dict["GBType"] is None: + plane_defect = URIRef(f'{self._name}_GrainBoundary') self.add((plane_defect, RDF.type, PLDO.GrainBoundary)) + elif gb_dict["GBType"] == "Twist": + plane_defect = URIRef(f'{self._name}_TwistGrainBoundary') self.add((plane_defect, RDF.type, PLDO.TwistGrainBoundary)) + elif gb_dict["GBType"] == "Tilt": + plane_defect = URIRef(f'{self._name}_TiltGrainBoundary') self.add((plane_defect, RDF.type, PLDO.TiltGrainBoundary)) + elif gb_dict["GBType"] == "Symmetric Tilt": + plane_defect = URIRef(f'{self._name}_SymmetricalTiltGrainBoundary') self.add((plane_defect, RDF.type, PLDO.SymmetricalTiltGrainBoundary)) + elif gb_dict["GBType"] == "Mixed": + plane_defect = URIRef(f'{self._name}_MixedGrainBoundary') self.add((plane_defect, RDF.type, PLDO.MixedGrainBoundary)) + + self.add((self.material, CMSO.hasDefect, plane_defect)) self.add((plane_defect, PLDO.hasSigmaValue, Literal(gb_dict["sigma"], datatype=XSD.integer))) #now mark that the defect is GB @@ -630,7 +608,7 @@ def add_gb(self, gb_dict, name=None): #self.add((misorientation_angle_01, RDF.type, PLDO.MisorientationAngle)) #self.add((misorientation_angle_01, PLDO.hasAngle, Literal(gb_dict["MisorientationAngle"], datatype=XSD.float))) - def add_vacancy(self, concentration, number=None, name=None): + def add_vacancy(self, concentration, number=None): """ Add Vacancy details which will be annotated by PODO @@ -646,7 +624,7 @@ def add_vacancy(self, concentration, number=None, name=None): ------- """ - vacancy = BNode(name) + vacancy = URIRef(f'{self._name}_Vacancy') self.add((self.material, CMSO.hasDefect, vacancy)) self.add((vacancy, RDF.type, PODO.Vacancy)) self.add((self.simulation_cell, PODO.hasVacancyConcentration, Literal(concentration, datatype=XSD.float))) @@ -657,7 +635,7 @@ def add_vacancy(self, concentration, number=None, name=None): def add_calculated_quantity(self, propertyname, value, unit=None, sample=None): - prop = BNode() + prop = URIRef(f'{self._name}_{propertyname}') if sample is None: sample = self.sample self.add((sample, CMSO.hasCalculatedProperty, prop)) From 40fae5ed4409b0c299f5c51d212116235c37158b Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 19:15:51 +0100 Subject: [PATCH 22/47] remove stray BNodes --- pyscal_rdf/graph.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 65bbc57..9167460 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -258,7 +258,7 @@ def add_sample(self): ------- """ - sample = BNode(name) + sample = URIRef(f'{self._name}') self.add((sample, RDF.type, CMSO.AtomicScaleSample)) self.sample = sample @@ -275,7 +275,7 @@ def add_material(self): ------- """ - material = BNode(name) + material = URIRef(f'{self._name}_Material') self.add((self.sample, CMSO.hasMaterial, material)) self.add((material, RDF.type, CMSO.CrystallineMaterial)) self.material = material From f5d8dd0dd93147e33cb3895a8dd2bd40892249ff Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 19:24:31 +0100 Subject: [PATCH 23/47] update visualisation --- pyscal_rdf/graph.py | 2 +- pyscal_rdf/visualize.py | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 9167460..c4123c6 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -196,7 +196,7 @@ def add_structure_to_graph(self, name_index = self.n_samples + 1 self._name = f'sample_{name_index}' else: - self._name = uuid.uuid4() + self._name = str(uuid.uuid4()) self.create_graph() structure.sample = self.sample diff --git a/pyscal_rdf/visualize.py b/pyscal_rdf/visualize.py index 26252e5..39f5c24 100644 --- a/pyscal_rdf/visualize.py +++ b/pyscal_rdf/visualize.py @@ -9,28 +9,37 @@ def get_title_from_BNode(x): return x.toPython() def get_string_from_URI(x): + """ + Extract a presentable string from URI + + Also differentiate between fixed notes and URIs, and assign color + """ raw = x.toPython() #first try splitting by # rawsplit = raw.split("#") if len(rawsplit) > 1: - return rawsplit[-1] + return rawsplit[-1], "URIRef" + #try splitting by = for chebi values if 'CHEBI' in raw: rawsplit = raw.split("=") rawsplit = rawsplit[-1].split(":") if len(rawsplit) > 1: - return ".".join(rawsplit[-2:]) + return ".".join(rawsplit[-2:]), "URIRef" #just a normal url split now rawsplit = raw.split("/") if len(rawsplit) > 1: - return ".".join(rawsplit[-2:]) + return ".".join(rawsplit[-2:]), "URIRef" + + #none of the conditions, worked, which means its a hex string + return raw, "BNode" def parse_object(x): if isinstance(x, BNode): return get_title_from_BNode(x), "BNode" elif isinstance(x, URIRef): - return get_string_from_URI(x), "URIRef" + return get_string_from_URI(x) elif isinstance(x, Literal): return str(x.title()), "Literal" From 07f3ec33131f0afff31e639b5d9ec390f056208e Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 19:58:08 +0100 Subject: [PATCH 24/47] save positions and species to file --- pyscal_rdf/graph.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index c4123c6..f384b94 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -15,6 +15,7 @@ import pandas as pd import yaml import uuid +import pyscal_rdf.json_io as json_io from pyscal_rdf.visualize import visualize_graph from pyscal_rdf.network.network import OntologyNetwork @@ -494,8 +495,19 @@ def add_atoms(self): Note that for the moment, we will dump the structures in a given folder, maybe this could be input from the Job class directly """ - #start a path to store the data - #samples are BNodes, so names may not be unique, therefore we create one + #now we write out file + datadict = { + position_identifier:{ + "value": self.system.atom_attribute.position, + "label": "position", + }, + species_identifier:{ + "value": self.system.atom_attribute.species, + "label": "species", + }, + } + outfile = os.path.join(self.structure_store, self._sample) + json_io.write_file(outfile, datadict) if "positions" in self.system.atoms.keys(): position = URIRef(f'{self._name}_Position') @@ -504,6 +516,7 @@ def add_atoms(self): self.add((position, CMSO.hasName, Literal('Position', datatype=XSD.string))) position_identifier = uuid.uuid4() self.add((position, CMSO.hasIdentifier, Literal(position_identifier, datatype=XSD.string))) + self.add((position, CMSO.hasPath, Literal(outfile, datatype=XSD.string))) if "species" in self.system.atoms.keys(): species = URIRef(f'{self._name}_Species') @@ -512,6 +525,7 @@ def add_atoms(self): self.add((species, CMSO.hasName, Literal('Species', datatype=XSD.string))) species_identifier = uuid.uuid4() self.add((species, CMSO.hasIdentifier, Literal(species_identifier, datatype=XSD.string))) + self.add((species, CMSO.hasPath, Literal(outfile, datatype=XSD.string))) #if "velocities" in self.sys.atoms.keys(): # uname = None From da135af772aed46d54c7b80b90034a2622a04c87 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 20:16:30 +0100 Subject: [PATCH 25/47] fix path name --- pyscal_rdf/graph.py | 17 +++++++++-------- pyscal_rdf/properties.py | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index f384b94..ea382d2 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -112,7 +112,7 @@ def __init__(self, graph_file=None, raise ValueError("store should be pyiron_project, SQLAlchemy, or Memory") #start the storage - _setup_structure_store(self.structure_store) + self.structure_store = _setup_structure_store(self.structure_store) #start binding self.graph.bind("cmso", CMSO) @@ -496,17 +496,20 @@ def add_atoms(self): maybe this could be input from the Job class directly """ #now we write out file + position_identifier = str(uuid.uuid4()) + species_identifier = str(uuid.uuid4()) + datadict = { position_identifier:{ - "value": self.system.atom_attribute.position, + "value": self.system.schema.atom_attribute.position(), "label": "position", }, species_identifier:{ - "value": self.system.atom_attribute.species, + "value": self.system.schema.atom_attribute.species(), "label": "species", }, } - outfile = os.path.join(self.structure_store, self._sample) + outfile = os.path.join(self.structure_store, str(self._name)) json_io.write_file(outfile, datadict) if "positions" in self.system.atoms.keys(): @@ -514,18 +517,16 @@ def add_atoms(self): self.add((self.sample, CMSO.hasAttribute, position)) self.add((position, RDF.type, CMSO.AtomAttribute)) self.add((position, CMSO.hasName, Literal('Position', datatype=XSD.string))) - position_identifier = uuid.uuid4() self.add((position, CMSO.hasIdentifier, Literal(position_identifier, datatype=XSD.string))) - self.add((position, CMSO.hasPath, Literal(outfile, datatype=XSD.string))) + self.add((position, CMSO.hasPath, Literal(os.path.relpath(outfile), datatype=XSD.string))) if "species" in self.system.atoms.keys(): species = URIRef(f'{self._name}_Species') self.add((self.sample, CMSO.hasAttribute, species)) self.add((species, RDF.type, CMSO.AtomAttribute)) self.add((species, CMSO.hasName, Literal('Species', datatype=XSD.string))) - species_identifier = uuid.uuid4() self.add((species, CMSO.hasIdentifier, Literal(species_identifier, datatype=XSD.string))) - self.add((species, CMSO.hasPath, Literal(outfile, datatype=XSD.string))) + self.add((species, CMSO.hasPath, Literal(os.path.relpath(outfile), datatype=XSD.string))) #if "velocities" in self.sys.atoms.keys(): # uname = None diff --git a/pyscal_rdf/properties.py b/pyscal_rdf/properties.py index 8e54c8a..e24053c 100644 --- a/pyscal_rdf/properties.py +++ b/pyscal_rdf/properties.py @@ -107,7 +107,7 @@ def get_spacegroup_number(system): # ATOM attributes #-------------------------------------------- def get_position(system): - return system.atoms.position + return system.atoms.positions def get_species(system): return system.atoms.species From df19ce5577e1a312b9945b74c29b23adc5d2415d Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 20:21:05 +0100 Subject: [PATCH 26/47] save file --- pyscal_rdf/graph.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index ea382d2..3dd25e4 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -518,7 +518,7 @@ def add_atoms(self): self.add((position, RDF.type, CMSO.AtomAttribute)) self.add((position, CMSO.hasName, Literal('Position', datatype=XSD.string))) self.add((position, CMSO.hasIdentifier, Literal(position_identifier, datatype=XSD.string))) - self.add((position, CMSO.hasPath, Literal(os.path.relpath(outfile), datatype=XSD.string))) + self.add((position, CMSO.hasPath, Literal(os.path.relpath(outfile+'.json'), datatype=XSD.string))) if "species" in self.system.atoms.keys(): species = URIRef(f'{self._name}_Species') @@ -526,7 +526,7 @@ def add_atoms(self): self.add((species, RDF.type, CMSO.AtomAttribute)) self.add((species, CMSO.hasName, Literal('Species', datatype=XSD.string))) self.add((species, CMSO.hasIdentifier, Literal(species_identifier, datatype=XSD.string))) - self.add((species, CMSO.hasPath, Literal(os.path.relpath(outfile), datatype=XSD.string))) + self.add((species, CMSO.hasPath, Literal(os.path.relpath(outfile+'.json'), datatype=XSD.string))) #if "velocities" in self.sys.atoms.keys(): # uname = None From 35428646688dd95dee2cff1a9eadb2c076299616 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 20:27:54 +0100 Subject: [PATCH 27/47] separate serialise function --- pyscal_rdf/graph.py | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 3dd25e4..5015482 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -105,6 +105,7 @@ def __init__(self, graph_file=None, #here modify structure store if needed if self.structure_store is None: self.structure_store = os.path.join(prpath, 'pyscal_rdf_structure_store') + store = 'pyiron_project' except: raise ValueError("store should be pyiron_project, SQLAlchemy, or Memory") @@ -130,6 +131,7 @@ def __init__(self, graph_file=None, ontology = read_ontology() self.ontology = ontology self._atom_ids = None + self.store = store def process_structure(self, structure, format=None): @@ -477,7 +479,28 @@ def add_lattice_properties(self): self.add((lattice_angle, CMSO.hasAngle_alpha, Literal(data[0], datatype=XSD.float))) self.add((lattice_angle, CMSO.hasAngle_beta, Literal(data[1], datatype=XSD.float))) self.add((lattice_angle, CMSO.hasAngle_gamma, Literal(data[2], datatype=XSD.float))) - + + + def _save_atom_attributes(self, position_identifier, species_identifier): + if self.store == 'pyiron': + pass + else: + #this is the file based store system + datadict = { + position_identifier:{ + "value": self.system.schema.atom_attribute.position(), + "label": "position", + }, + species_identifier:{ + "value": self.system.schema.atom_attribute.species(), + "label": "species", + }, + } + outfile = os.path.join(self.structure_store, str(self._name)) + json_io.write_file(outfile, datadict) + return os.path.relpath(outfile+'.json') + + def add_atoms(self): """ Add Atoms including their species and positions @@ -499,18 +522,7 @@ def add_atoms(self): position_identifier = str(uuid.uuid4()) species_identifier = str(uuid.uuid4()) - datadict = { - position_identifier:{ - "value": self.system.schema.atom_attribute.position(), - "label": "position", - }, - species_identifier:{ - "value": self.system.schema.atom_attribute.species(), - "label": "species", - }, - } - outfile = os.path.join(self.structure_store, str(self._name)) - json_io.write_file(outfile, datadict) + outfile = self._save_atom_attributes(position_identifier, species_identifier) if "positions" in self.system.atoms.keys(): position = URIRef(f'{self._name}_Position') @@ -518,7 +530,7 @@ def add_atoms(self): self.add((position, RDF.type, CMSO.AtomAttribute)) self.add((position, CMSO.hasName, Literal('Position', datatype=XSD.string))) self.add((position, CMSO.hasIdentifier, Literal(position_identifier, datatype=XSD.string))) - self.add((position, CMSO.hasPath, Literal(os.path.relpath(outfile+'.json'), datatype=XSD.string))) + self.add((position, CMSO.hasPath, Literal(outfile, datatype=XSD.string))) if "species" in self.system.atoms.keys(): species = URIRef(f'{self._name}_Species') @@ -526,7 +538,7 @@ def add_atoms(self): self.add((species, RDF.type, CMSO.AtomAttribute)) self.add((species, CMSO.hasName, Literal('Species', datatype=XSD.string))) self.add((species, CMSO.hasIdentifier, Literal(species_identifier, datatype=XSD.string))) - self.add((species, CMSO.hasPath, Literal(os.path.relpath(outfile+'.json'), datatype=XSD.string))) + self.add((species, CMSO.hasPath, Literal(outfile, datatype=XSD.string))) #if "velocities" in self.sys.atoms.keys(): # uname = None From 42d6c4883fbf9540fe0c50d453c15b627d52d927 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 21:09:30 +0100 Subject: [PATCH 28/47] separate atom serialisation --- pyscal_rdf/graph.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 5015482..f49102a 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -482,23 +482,23 @@ def add_lattice_properties(self): def _save_atom_attributes(self, position_identifier, species_identifier): - if self.store == 'pyiron': - pass - else: - #this is the file based store system - datadict = { - position_identifier:{ - "value": self.system.schema.atom_attribute.position(), - "label": "position", - }, - species_identifier:{ - "value": self.system.schema.atom_attribute.species(), - "label": "species", - }, - } - outfile = os.path.join(self.structure_store, str(self._name)) - json_io.write_file(outfile, datadict) - return os.path.relpath(outfile+'.json') + #if self.store == 'pyiron': + # pass + #else: + # #this is the file based store system + datadict = { + position_identifier:{ + "value": self.system.schema.atom_attribute.position(), + "label": "position", + }, + species_identifier:{ + "value": self.system.schema.atom_attribute.species(), + "label": "species", + }, + } + outfile = os.path.join(self.structure_store, str(self._name)) + json_io.write_file(outfile, datadict) + return os.path.relpath(outfile+'.json') def add_atoms(self): From f3efffabb622121028116ec9912c77bdcc2f2b8b Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 21:34:03 +0100 Subject: [PATCH 29/47] fix method to extract sample --- pyscal_rdf/graph.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index f49102a..4e4abbf 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -15,6 +15,7 @@ import pandas as pd import yaml import uuid +import json import pyscal_rdf.json_io as json_io from pyscal_rdf.visualize import visualize_graph @@ -974,21 +975,18 @@ def get_system_from_sample(self, sample): cell_vectors[0].append(self.graph.value(s[2], CMSO.hasComponent_x).toPython()) cell_vectors[1].append(self.graph.value(s[2], CMSO.hasComponent_y).toPython()) cell_vectors[2].append(self.graph.value(s[2], CMSO.hasComponent_z).toPython()) + #cell_vectors + filepath = self.graph.value(URIRef(f'{sample}_Position'), CMSO.hasPath).toPython() + position_identifier = self.graph.value(URIRef(f'{sample}_Position'), CMSO.hasIdentifier).toPython() + species_identifier = self.graph.value(URIRef(f'{sample}_Species'), CMSO.hasIdentifier).toPython() - positions = [] - species = [] + #open the file for reading + with open(filepath, 'r') as fin: + data = json.load(fin) + positions = data[position_identifier]['value'] + species = data[species_identifier]['value'] - for atom in self.graph.triples((sample, CMSO.hasAtom, None)): - vector = self.graph.value(atom[2], CMSO.hasPositionVector) - pt = [] - pt.append(self.graph.value(vector, CMSO.hasComponent_x).toPython()) - pt.append(self.graph.value(vector, CMSO.hasComponent_y).toPython()) - pt.append(self.graph.value(vector, CMSO.hasComponent_z).toPython()) - element = self.graph.value(atom[2], CMSO.hasElement) - species.append(self.graph.value(element, CMSO.hasSymbol).toPython()) - positions.append(pt) - atoms = {"positions": positions, "species": species} at = Atoms() at.from_dict(atoms) From 3cf07fa280db9c6fe6771b66b8c3b609f64f1032 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 22:02:13 +0100 Subject: [PATCH 30/47] add publish method --- pyscal_rdf/graph.py | 100 ++++++++++++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 36 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 4e4abbf..ab0dfc8 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -16,6 +16,7 @@ import yaml import uuid import json +import shutil import pyscal_rdf.json_io as json_io from pyscal_rdf.visualize import visualize_graph @@ -829,41 +830,37 @@ def write(self, filename, format="json-ld"): with open(filename, "w") as fout: fout.write(self.graph.serialize(format=format)) - - - def to_file(self, sample, filename=None, format="lammps-dump"): + + def publish(self, package_name, format='turtle'): """ - Save a given sample to a file + Publish a dataset from graph including per atom quantities + """ + #first step make a folder + if os.path.exists(package_name): + raise ValueError(f'{package_name} already exists') + os.mkdir(package_name) + structure_store = f'{package_name}/{os.path.basename(self.structure_store)}' + os.mkdir(structure_store) - Parameters - ---------- - sample - ID of the sample + #now go through each sample, and copy the file, at the same time fix the paths + for sample in self.samples: + filepath = self.graph.value(URIRef(f'{sample}_Position'), CMSO.hasPath).toPython() + shutil.copy(filepath, structure_store) + + #now we have to remove the old path, and fix new + for val in ['Position', 'Species']: + self.graph.remove((URIRef(f'{sample}_{val}'), CMSO.hasPath, None)) + + #assign corrected path + new_relpath = "/".join([os.path.basename(self.structure_store), filepath.split('/')[-1]]) + self.graph.add((URIRef(f'{sample}_{val}'), CMSO.hasPath, Literal(new_relpath, datatype=XSD.string))) + + triple_file = os.path.join(package_name, 'triples') + self.write(triple_file, format=format) - filename: string - name of output file - format: string, {"lammps-dump","lammps-data", "poscar"} - Returns - ------- - None - """ - if filename is None: - filename = os.path.join(os.getcwd(), "out") - - sys = self.get_system_from_sample(sample) - - if format=="ase": - return sys.write.ase() - elif format=='poscar': - asesys = sys.write.ase() - write(filename, asesys, format="vasp") - else: - asesys = sys.write.ase() - write(filename, asesys, format=format) - def query(self, inquery): """ @@ -895,15 +892,15 @@ def auto_query(self, source, destination, if return_query: return query return self.query(query) - - - def query_sample(self, destination, condition=None, return_query=False, enforce_types=True): - return self.auto_query(self.ontology.terms.cmso.AtomicScaleSample, destination, - condition=condition, return_query=return_query, enforce_types=enforce_types) + ################################# # Methods to interact with sample ################################# + def query_sample(self, destination, condition=None, return_query=False, enforce_types=True): + return self.auto_query(self.ontology.terms.cmso.AtomicScaleSample, destination, + condition=condition, return_query=return_query, enforce_types=enforce_types) + @property def n_samples(self): """ @@ -992,7 +989,38 @@ def get_system_from_sample(self, sample): at.from_dict(atoms) sys = System() sys.box = cell_vectors - sys.atoms = at + sys.atoms = at + return sys + + def to_file(self, sample, filename=None, format="lammps-dump"): + """ + Save a given sample to a file + + Parameters + ---------- + sample + ID of the sample + filename: string + name of output file + + format: string, {"lammps-dump","lammps-data", "poscar"} + + Returns + ------- + None + """ + + if filename is None: + filename = os.path.join(os.getcwd(), "out") - return sys + sys = self.get_system_from_sample(sample) + + if format=="ase": + return sys.write.ase() + elif format=='poscar': + asesys = sys.write.ase() + write(filename, asesys, format="vasp") + else: + asesys = sys.write.ase() + write(filename, asesys, format=format) From 7ca830f9adb6d2f946f113ffe9cfb849b2af0a89 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 22:33:45 +0100 Subject: [PATCH 31/47] add possibility to zip --- pyscal_rdf/graph.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index ab0dfc8..0139683 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -17,6 +17,7 @@ import uuid import json import shutil +import tarfile import pyscal_rdf.json_io as json_io from pyscal_rdf.visualize import visualize_graph @@ -831,7 +832,7 @@ def write(self, filename, format="json-ld"): with open(filename, "w") as fout: fout.write(self.graph.serialize(format=format)) - def publish(self, package_name, format='turtle'): + def publish(self, package_name, format='turtle', compress=True): """ Publish a dataset from graph including per atom quantities """ @@ -858,9 +859,9 @@ def publish(self, package_name, format='turtle'): triple_file = os.path.join(package_name, 'triples') self.write(triple_file, format=format) - - - + if compress: + with tarfile.open(f'{package_name}.tar.gz', "w:gz") as tar: + tar.add(package_name, arcname=os.path.basename(package_name)) def query(self, inquery): """ From 1049ee135b878082a637bd57a2224d3d13810776 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Mon, 4 Dec 2023 22:34:57 +0100 Subject: [PATCH 32/47] add possibility to zip --- pyscal_rdf/graph.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 0139683..cb8933e 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -839,6 +839,10 @@ def publish(self, package_name, format='turtle', compress=True): #first step make a folder if os.path.exists(package_name): raise ValueError(f'{package_name} already exists') + if compress: + if os.path.exists(f'{package_name}.tar.gz'): + raise ValueError(f'{package_name} tarball already exists') + os.mkdir(package_name) structure_store = f'{package_name}/{os.path.basename(self.structure_store)}' os.mkdir(structure_store) From 43548d2666eb8f23fd0ca74aa7b3a19cdabe2552 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Tue, 5 Dec 2023 00:50:09 +0100 Subject: [PATCH 33/47] update unpack --- pyscal_rdf/graph.py | 29 +++++++++++++++++++++++++---- pyscal_rdf/structure.py | 11 +++++++++-- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index cb8933e..4243223 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -67,7 +67,7 @@ def _replace_keys(refdict, indict): def _setup_structure_store(structure_store): if structure_store is None: - structure_store = os.path.join(os.getcwd(), 'pyscal_rdf_structure_store') + structure_store = os.path.join(os.getcwd(), 'rdf_structure_store') if not os.path.exists(structure_store): os.mkdir(structure_store) return structure_store @@ -832,7 +832,7 @@ def write(self, filename, format="json-ld"): with open(filename, "w") as fout: fout.write(self.graph.serialize(format=format)) - def publish(self, package_name, format='turtle', compress=True): + def archive(self, package_name, format='turtle', compress=True): """ Publish a dataset from graph including per atom quantities """ @@ -844,7 +844,7 @@ def publish(self, package_name, format='turtle', compress=True): raise ValueError(f'{package_name} tarball already exists') os.mkdir(package_name) - structure_store = f'{package_name}/{os.path.basename(self.structure_store)}' + structure_store = f'{package_name}/rdf_structure_store' os.mkdir(structure_store) #now go through each sample, and copy the file, at the same time fix the paths @@ -857,7 +857,7 @@ def publish(self, package_name, format='turtle', compress=True): self.graph.remove((URIRef(f'{sample}_{val}'), CMSO.hasPath, None)) #assign corrected path - new_relpath = "/".join([os.path.basename(self.structure_store), filepath.split('/')[-1]]) + new_relpath = "/".join(['rdf_structure_store', filepath.split('/')[-1]]) self.graph.add((URIRef(f'{sample}_{val}'), CMSO.hasPath, Literal(new_relpath, datatype=XSD.string))) triple_file = os.path.join(package_name, 'triples') @@ -866,6 +866,27 @@ def publish(self, package_name, format='turtle', compress=True): if compress: with tarfile.open(f'{package_name}.tar.gz', "w:gz") as tar: tar.add(package_name, arcname=os.path.basename(package_name)) + shutil.rmtree(package_name) + + + @classmethod + def unarchive(cls, package_name, compress=True, + store="Memory", + store_file=None, + identifier="http://default_graph", + ontology=None): + if compress: + package_base_name = ".".join(package_name.split(".")[:-2]) + with tarfile.open(package_name) as fin: + fin.extractall(package_base_name) + os.remove(package_name) + print(package_base_name) + print(f'{package_base_name}/triples') + return cls(store=store, store_file=store_file, + identifier=identifier, + graph_file=f'{package_base_name}/triples', + structure_store=f'{package_base_name}/rdf_structure_store', + ontology=ontology) def query(self, inquery): """ diff --git a/pyscal_rdf/structure.py b/pyscal_rdf/structure.py index 567a27d..e62e03e 100644 --- a/pyscal_rdf/structure.py +++ b/pyscal_rdf/structure.py @@ -98,9 +98,16 @@ class StructureGraph(RDFGraph): def __init__(self, graph_file=None, store="Memory", store_file=None, - identifier="http://default_graph"): + identifier="http://default_graph", + ontology=None, + structure_store=None): - super().__init__(graph_file=graph_file, store=store, store_file=store_file, identifier=identifier) + super().__init__(graph_file=graph_file, + store=store, + store_file=store_file, + identifier=identifier, + ontology=ontology, + structure_store=structure_store) self._element_dict = element_dict self._structure_dict = structure_dict From 8c2369e950570fd830e8f3dcb3b0edc46de74933 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Tue, 5 Dec 2023 08:06:40 +0100 Subject: [PATCH 34/47] debug archive method --- pyscal_rdf/graph.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 4243223..495ee8b 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -878,10 +878,9 @@ def unarchive(cls, package_name, compress=True, if compress: package_base_name = ".".join(package_name.split(".")[:-2]) with tarfile.open(package_name) as fin: - fin.extractall(package_base_name) - os.remove(package_name) - print(package_base_name) - print(f'{package_base_name}/triples') + fin.extractall(".") + #os.remove(package_name) + return cls(store=store, store_file=store_file, identifier=identifier, graph_file=f'{package_base_name}/triples', From 88a8600bbc7b550487ea075402ba1c45d29ee6fa Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Tue, 5 Dec 2023 14:31:59 +0100 Subject: [PATCH 35/47] add archive functionality --- pyscal_rdf/graph.py | 9 ++++---- pyscal_rdf/rdfsystem.py | 47 +++++++++++++++++++---------------------- pyscal_rdf/visualize.py | 5 +++++ 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 495ee8b..2c3bfd2 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -200,9 +200,9 @@ def add_structure_to_graph(self, if names: if name_index is None: name_index = self.n_samples + 1 - self._name = f'sample_{name_index}' + self._name = f'sample:{name_index}' else: - self._name = str(uuid.uuid4()) + self._name = f'sample:{str(uuid.uuid4())}' self.create_graph() structure.sample = self.sample @@ -499,7 +499,7 @@ def _save_atom_attributes(self, position_identifier, species_identifier): "label": "species", }, } - outfile = os.path.join(self.structure_store, str(self._name)) + outfile = os.path.join(self.structure_store, str(self._name).split(':')[-1]) json_io.write_file(outfile, datadict) return os.path.relpath(outfile+'.json') @@ -880,7 +880,8 @@ def unarchive(cls, package_name, compress=True, with tarfile.open(package_name) as fin: fin.extractall(".") #os.remove(package_name) - + #copy things out + return cls(store=store, store_file=store_file, identifier=identifier, graph_file=f'{package_base_name}/triples', diff --git a/pyscal_rdf/rdfsystem.py b/pyscal_rdf/rdfsystem.py index ebd432b..8f84c51 100644 --- a/pyscal_rdf/rdfsystem.py +++ b/pyscal_rdf/rdfsystem.py @@ -65,40 +65,37 @@ def __init__(self, filename = None, def __delitem__(self, val): if isinstance(val, int): val = [val] + #now the graph has to be updated accordingly if self.graph is not None: #first annotate graph c = (len(val)/self.natoms) self.graph.add_vacancy(c, number=len(val)) #now we need to re-add atoms, so at to remove - #deleted ones from the vacancy - atoms = [self._atom_ids[v] for v in val] - #this is the list of atoms in this sample - for atom in atoms: - #identify the position - position = list([s[2] for s in self.graph.graph.triples((atom, CMSO.hasPositionVector, None))])[0] - self.graph.graph.remove((position, None, None)) - #identify element - element = list([s[2] for s in self.graph.graph.triples((atom, CMSO.hasElement, None))])[0] - self.graph.graph.remove((element, None, None)) - #now remove the atom from the list completely - self.graph.graph.remove((atom, None, None)) - self.graph.graph.remove((None, None, atom)) - #now fully remove atoms - for atom in atoms: - self._atom_ids.remove(atom) - #now fix the number of atoms self.graph.graph.remove((self.sample, CMSO.hasNumberOfAtoms, None)) self.graph.graph.add((self.sample, CMSO.hasNumberOfAtoms, Literal(self.natoms-len(val), datatype=XSD.integer))) #revamp composition - #for that first get element - material = list([s[2] for s in self.graph.graph.triples((self.sample, CMSO.hasMaterial, None))])[0] #remove existing chem composution - self.graph.graph.remove((material, CMSO.hasElementRatio, None)) + chemical_species = self.graph.value(self.sample, CMSO.hasSpecies) + #start by cleanly removing elements + for s in self.graph.graph.triples((chemical_species, CMSO.hasElement, None)): + element = s[2] + self.graph.graph.remove((element, None, None)) + self.graph.graph.remove((chemical_species, None, None)) + self.graph.graph.remove((self.sample, CMSO.hasSpecies, None)) + #now recalculate and add it again - chem_comp_element = list(self.composition.keys()) - chem_comp_ratio = [val for key, val in self.composition.items()] - chem_comp = ["=".join([str(x), str(y)]) for x,y in zip(chem_comp_element, chem_comp_ratio)] - for x in range(len(chem_comp)): - self.graph.graph.add((material, CMSO.hasElementRatio, Literal(chem_comp[x], datatype=XSD.string))) + composition = self.schema.material.element_ratio() + + chemical_species = URIRef(f'{self._name}_ChemicalSpecies') + self.graph.graph.add((self.sample, CMSO.hasSpecies, chemical_species)) + self.graph.graph.add((chemical_species, RDF.type, CMSO.ChemicalSpecies)) + + for e, r in composition.items(): + if e in element_indetifiers.keys(): + element = URIRef(element_indetifiers[e]) + self.add((chemical_species, CMSO.hasElement, element)) + self.add((element, RDF.type, CMSO.Element)) + self.add((element, CMSO.hasSymbol, Literal(e, datatype=XSD.string))) + self.add((element, CMSO.hasElementRatio, Literal(r, datatype=XSD.float))) self.delete(indices=list(val)) \ No newline at end of file diff --git a/pyscal_rdf/visualize.py b/pyscal_rdf/visualize.py index 39f5c24..2d8f928 100644 --- a/pyscal_rdf/visualize.py +++ b/pyscal_rdf/visualize.py @@ -27,6 +27,11 @@ def get_string_from_URI(x): if len(rawsplit) > 1: return ".".join(rawsplit[-2:]), "URIRef" + if 'sample:' in raw: + rawsplit = raw.split(":") + if len(rawsplit) > 1: + return "_".join(rawsplit), "BNode" + #just a normal url split now rawsplit = raw.split("/") if len(rawsplit) > 1: From 9b8bf9fd2c964dd6f73fb600e53f6834949bfbf7 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Tue, 5 Dec 2023 17:11:35 +0100 Subject: [PATCH 36/47] remove object store --- pyscal_rdf/graph.py | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index 2c3bfd2..a55798b 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -93,25 +93,7 @@ def __init__(self, graph_file=None, raise ValueError("store file is needed if store is not memory") self.graph = Graph(store="SQLAlchemy", identifier=identifier) uri = Literal(f"sqlite:///{store_file}") - self.graph.open(uri, create=True) - - elif inspect.isclass(type(store)): - try: - prpath = store.path - dbfile = os.path.join(prpath, 'project.db') - - #now start sqlalchemy instance - self.graph = Graph(store="SQLAlchemy", identifier=identifier) - uri = Literal(f"sqlite:///{dbfile}") - self.graph.open(uri, create=True) - - #here modify structure store if needed - if self.structure_store is None: - self.structure_store = os.path.join(prpath, 'pyscal_rdf_structure_store') - store = 'pyiron_project' - except: - raise ValueError("store should be pyiron_project, SQLAlchemy, or Memory") - + self.graph.open(uri, create=True) else: raise ValueError("store should be pyiron_project, SQLAlchemy, or Memory") From 17599d376a0c83984c88caa42c2346d9943a1f30 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Tue, 5 Dec 2023 17:51:55 +0100 Subject: [PATCH 37/47] update units --- pyscal_rdf/graph.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index a55798b..c5cbaeb 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -221,16 +221,16 @@ def create_graph(self): #extra triples self.add((CMSO.SimulationCellLength, RDFS.subClassOf, CMSO.Length)) self.add((CMSO.LatticeParameter, RDFS.subClassOf, CMSO.Length)) - self.add((CMSO.Length, CMSO.hasUnit, URIRef("https://qudt.org/2.1/vocab/unit#ANGSTROM"))) + self.add((CMSO.Length, CMSO.hasUnit, URIRef("http://qudt.org/vocab/unit/ANGSTROM"))) self.add((CMSO.SimulationCellAngle, RDFS.subClassOf, CMSO.Angle)) self.add((CMSO.LatticeAngle, RDFS.subClassOf, CMSO.Angle)) - self.add((CMSO.Angle, CMSO.hasUnit, URIRef("https://qudt.org/2.1/vocab/unit#DEG"))) + self.add((CMSO.Angle, CMSO.hasUnit, URIRef("http://qudt.org/vocab/unit/DEG"))) self.add((CMSO.LatticeVector, RDFS.subClassOf, CMSO.Vector)) self.add((CMSO.SimulationCellVector, RDFS.subClassOf, CMSO.Vector)) self.add((CMSO.PositionVector, RDFS.subClassOf, CMSO.Vector)) - self.add((CMSO.Vector, CMSO.hasUnit, URIRef("https://qudt.org/2.1/vocab/unit#ANGSTROM"))) + self.add((CMSO.Vector, CMSO.hasUnit, URIRef("http://qudt.org/vocab/unit/ANGSTROM"))) def add_sample(self): @@ -655,7 +655,7 @@ def add_calculated_quantity(self, propertyname, value, unit=None, sample=None): self.add((prop, RDFS.label, Literal(propertyname))) self.add((prop, CMSO.hasValue, Literal(value))) if unit is not None: - self.add((prop, CMSO.hasUnit, URIRef(f'https://qudt.org/2.1/vocab/unit#{unit}'))) + self.add((prop, CMSO.hasUnit, URIRef(f'http://qudt.org/vocab/unit/{unit}'))) def inspect_sample(self, sample=None): From 739b9cc836a5872c5bcdfc997fadeb86ac8010fc Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Tue, 5 Dec 2023 17:59:22 +0100 Subject: [PATCH 38/47] add fix for viz --- pyscal_rdf/visualize.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pyscal_rdf/visualize.py b/pyscal_rdf/visualize.py index 2d8f928..42969b9 100644 --- a/pyscal_rdf/visualize.py +++ b/pyscal_rdf/visualize.py @@ -31,6 +31,10 @@ def get_string_from_URI(x): rawsplit = raw.split(":") if len(rawsplit) > 1: return "_".join(rawsplit), "BNode" + + rawsplit = raw.split(':') + if len(rawsplit) == 2: + return "_".join(rawsplit), "BNode" #just a normal url split now rawsplit = raw.split("/") From b17ed80e24c61abe0f22fe30cac510086b56893d Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Tue, 5 Dec 2023 18:01:09 +0100 Subject: [PATCH 39/47] add fix for viz --- pyscal_rdf/visualize.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyscal_rdf/visualize.py b/pyscal_rdf/visualize.py index 42969b9..9b4edf6 100644 --- a/pyscal_rdf/visualize.py +++ b/pyscal_rdf/visualize.py @@ -32,15 +32,15 @@ def get_string_from_URI(x): if len(rawsplit) > 1: return "_".join(rawsplit), "BNode" - rawsplit = raw.split(':') - if len(rawsplit) == 2: - return "_".join(rawsplit), "BNode" - #just a normal url split now rawsplit = raw.split("/") if len(rawsplit) > 1: return ".".join(rawsplit[-2:]), "URIRef" + rawsplit = raw.split(':') + if len(rawsplit) == 2: + return "_".join(rawsplit), "BNode" + #none of the conditions, worked, which means its a hex string return raw, "BNode" From a8c14afcf505b91f1dd4cc0d2016955dd9f4b5e4 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Wed, 6 Dec 2023 11:59:51 +0100 Subject: [PATCH 40/47] add workflow view to visualisation --- pyscal_rdf/graph.py | 8 +++- pyscal_rdf/visualize.py | 94 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 89 insertions(+), 13 deletions(-) diff --git a/pyscal_rdf/graph.py b/pyscal_rdf/graph.py index c5cbaeb..bcab1e4 100644 --- a/pyscal_rdf/graph.py +++ b/pyscal_rdf/graph.py @@ -740,7 +740,9 @@ def visualise(self, edge_color="#37474F", styledict=None, graph_attr ={'rankdir': 'BT'}, - layoutname='cola'): + layoutname='cola', + hide_types=False, + workflow_view=False): """ Vosualise the RDF tree of the Graph @@ -791,7 +793,9 @@ def visualise(self, edge_color=edge_color, styledict=sdict, graph_attr=graph_attr, - layoutname=layoutname) + layoutname=layoutname, + hide_types=hide_types, + workflow_view=workflow_view) def write(self, filename, format="json-ld"): diff --git a/pyscal_rdf/visualize.py b/pyscal_rdf/visualize.py index 9b4edf6..01c3872 100644 --- a/pyscal_rdf/visualize.py +++ b/pyscal_rdf/visualize.py @@ -1,10 +1,11 @@ import graphviz import os -from rdflib import BNode, URIRef, Literal +from rdflib import BNode, URIRef, Literal, Namespace import uuid import json import ipycytoscape + def get_title_from_BNode(x): return x.toPython() @@ -75,22 +76,30 @@ def visualize_graph(g, edge_color="#37474F", styledict=styledict, graph_attr ={'rankdir': 'LR'}, - layoutname='cola'): + layoutname='cola', + hide_types=False, + workflow_view=False): if backend=='ipycytoscape': return _visualize_graph_ipycytoscape_backend(g, edge_color=edge_color, styledict=styledict, - layoutname=layoutname) + layoutname=layoutname, + hide_types=hide_types, + workflow_view=workflow_view) else: return _visualize_graph_graphviz_backend(g, edge_color=edge_color, styledict=styledict, - graph_attr=graph_attr) + graph_attr=graph_attr, + hide_types=hide_types, + workflow_view=workflow_view) def _visualize_graph_ipycytoscape_backend(g, edge_color="#37474F", styledict=styledict, - layoutname='cola'): + layoutname='cola', + hide_types=False, + workflow_view=False): #first step is to create the json file # we can start with a dict gdict = {} @@ -98,6 +107,38 @@ def _visualize_graph_ipycytoscape_backend(g, gdict["edges"] = [] for k in g: string1, istype1 = parse_object(k[0]) + string2, istype2 = parse_object(k[2]) + string3, istype3 = parse_object(k[1]) + + plot = True + + if workflow_view: + #we collapse sample information + #if cmso.connector is found, only use it is it is cmso.hasCalculated + #all sub sample props, indicated by sample_x_jsjsj will be ignored. + ssplit = string3.split('.') + if (len(ssplit) == 2): + if (ssplit[0] == 'cmso') and (ssplit[1] != "hasCalculatedProperty"): + plot = False + if string3 == 'subClassOf': + plot = False + ssplit = string2.split('.') + if string3 == 'type': + if (ssplit[0] == 'cmso') and (ssplit[1] not in ["CalculatedProperty"]): + plot = False + if (ssplit[0] == 'cmso') and (ssplit[1] in ["AtomicScaleSample"]): + dot.node(string1, label=string1, shape=styledict[istype1]["shape"], + style=styledict[istype1]["style"], + color=styledict[istype1]["color"], + fontsize=styledict[istype1]["fontsize"]) + plot=False + + if hide_types and (string3 == 'type'): + plot = False + + if not plot: + continue + id1 = _fix_id(string1, istype1) d = {"data": {"id": str(id1), "label": str(string1), @@ -107,7 +148,6 @@ def _visualize_graph_ipycytoscape_backend(g, "fontsize": styledict[istype1]['fontsize']}} gdict["nodes"].append(d) - string2, istype2 = parse_object(k[2]) id2 = _fix_id(string2, istype2) d = {"data": {"id": str(id2), "label": str(string2), @@ -116,8 +156,7 @@ def _visualize_graph_ipycytoscape_backend(g, "width": len(string2)*7, "fontsize": styledict[istype1]['fontsize']}} gdict["nodes"].append(d) - - string3, istype3 = parse_object(k[1]) + id3 = str(uuid.uuid4()) d = {"data": {"id": str(id3), "label": str(string3), @@ -181,13 +220,48 @@ def _visualize_graph_graphviz_backend(g, edge_color="#37474F", styledict=styledict, graph_attr ={'rankdir': 'LR'}, - rankdir='LR'): + rankdir='LR', + hide_types=False, + workflow_view=False): dot = graphviz.Digraph() for key, val in graph_attr.items(): dot.graph_attr[key] = val + for k in g: string1, istype1 = parse_object(k[0]) + string2, istype2 = parse_object(k[2]) + string3, istype = parse_object(k[1]) + + plot = True + + if workflow_view: + #we collapse sample information + #if cmso.connector is found, only use it is it is cmso.hasCalculated + #all sub sample props, indicated by sample_x_jsjsj will be ignored. + ssplit = string3.split('.') + if (len(ssplit) == 2): + if (ssplit[0] == 'cmso') and (ssplit[1] != "hasCalculatedProperty"): + plot = False + if string3 == 'subClassOf': + plot = False + ssplit = string2.split('.') + if string3 == 'type': + if (ssplit[0] == 'cmso') and (ssplit[1] not in ["CalculatedProperty"]): + plot = False + if (ssplit[0] == 'cmso') and (ssplit[1] in ["AtomicScaleSample"]): + dot.node(string1, label=string1, shape=styledict[istype1]["shape"], + style=styledict[istype1]["style"], + color=styledict[istype1]["color"], + fontsize=styledict[istype1]["fontsize"]) + plot=False + + if hide_types and (string3 == 'type'): + plot = False + + if not plot: + continue + if istype1 == 'Literal': id1 = str(uuid.uuid4()) else: @@ -197,7 +271,6 @@ def _visualize_graph_graphviz_backend(g, color=styledict[istype1]["color"], fontsize=styledict[istype1]["fontsize"]) - string2, istype2 = parse_object(k[2]) if istype2 == 'Literal': id2 = str(uuid.uuid4()) else: @@ -207,7 +280,6 @@ def _visualize_graph_graphviz_backend(g, color=styledict[istype2]["color"], fontsize=styledict[istype2]["fontsize"]) - string3, istype = parse_object(k[1]) dot.edge(id1, id2, color=edge_color, label=string3, fontsize=styledict[istype2]["fontsize"]) return dot \ No newline at end of file From f6a9a2b7412055875ece795b31f2c3752a903d4a Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Wed, 6 Dec 2023 15:26:06 +0100 Subject: [PATCH 41/47] add potential aso mappings --- pyscal_rdf/data/msmo.owl | 56 ---------------------------------- pyscal_rdf/network/ontology.py | 16 +++++----- 2 files changed, 8 insertions(+), 64 deletions(-) delete mode 100644 pyscal_rdf/data/msmo.owl diff --git a/pyscal_rdf/data/msmo.owl b/pyscal_rdf/data/msmo.owl deleted file mode 100644 index ec9843f..0000000 --- a/pyscal_rdf/data/msmo.owl +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pyscal_rdf/network/ontology.py b/pyscal_rdf/network/ontology.py index dc2c8f8..5e86ecb 100644 --- a/pyscal_rdf/network/ontology.py +++ b/pyscal_rdf/network/ontology.py @@ -10,11 +10,11 @@ def read_ontology(): cmso = OntologyNetwork(os.path.join(file_location, 'data/cmso.owl')) pldo = OntologyNetwork(os.path.join(file_location, 'data/pldo.owl')) podo = OntologyNetwork(os.path.join(file_location, 'data/podo.owl')) - msmo = OntologyNetwork(os.path.join(file_location, 'data/msmo.owl')) + #msmo = OntologyNetwork(os.path.join(file_location, 'data/msmo.owl')) #combine them - combo = cmso + pldo + podo + msmo - #combo = cmso + pldo + podo + #combo = cmso + pldo + podo + msmo + combo = cmso + pldo + podo #add namespaces combo.add_namespace('prov', 'http://www.w3.org/ns/prov#') @@ -33,17 +33,17 @@ def read_ontology(): combo.add_term('http://www.w3.org/1999/02/22-rdf-syntax-ns#type', 'object_property', delimiter='#', namespace='rdf') #add paths + combo.add_path(('cmso:CrystalStructure', 'cmso:hasAltName', 'string')) combo.add_path(('cmso:Material', 'cmso:hasDefect', 'pldo:PlanarDefect')) combo.add_path(('cmso:Material', 'cmso:hasDefect', 'podo:Vacancy')) combo.add_path(('cmso:SimulationCell', 'podo:hasVacancyConcentration', 'float')) combo.add_path(('cmso:SimulationCell', 'podo:hasNumberOfVacancies', 'int')) combo.add_path(('cmso:ComputationalSample', 'prov:wasDerivedFrom', 'cmso:ComputationalSample')) - combo.add_path(('cmso:ComputationalSample', 'prov:wasGeneratedBy', 'msmo:ComputationalMethod')) - combo.add_path(('msmo:ComputationalMethod', 'prov:wasAssociatedWith', 'prov:SoftwareAgent')) combo.add_path(('cmso:ComputationalSample', 'rdf:type', 'prov:Entity')) - combo.add_path(('msmo:ComputationalMethod', 'rdf:type', 'prov:Activity')) - #for Alt Name, maybe this should not be here - combo.add_path(('cmso:CrystalStructure', 'cmso:hasAltName', 'string')) + #combo.add_path(('aso:StructureOptimization', 'rdf:type', 'prov:Activity')) + #combo.add_path(('aso:StructureOptimization', 'prov:wasAssociatedWith', 'prov:SoftwareAgent')) + #combo.add_path(('cmso:ComputationalSample', 'prov:wasGeneratedBy', 'aso:StructureOptimization')) + #return return combo \ No newline at end of file From bf3d0dbfaf48f7b16401bcb192670ec243870b87 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Fri, 8 Dec 2023 13:00:33 +0100 Subject: [PATCH 42/47] update ontology to ce1228377e5371e0306f1c70fc8711a088e66227 --- pyscal_rdf/data/asmo.owl | 1087 ++++++++++++++++++++++++++++++++++++++ pyscal_rdf/data/cmso.owl | 165 ++++-- 2 files changed, 1203 insertions(+), 49 deletions(-) create mode 100644 pyscal_rdf/data/asmo.owl diff --git a/pyscal_rdf/data/asmo.owl b/pyscal_rdf/data/asmo.owl new file mode 100644 index 0000000..ec013b0 --- /dev/null +++ b/pyscal_rdf/data/asmo.owl @@ -0,0 +1,1087 @@ + + + + https://orcid.org/0000-0002-6776-1213 + https://orcid.org/0000-0001-7564-7990 + ASMO is an ontology that aims to define the concepts needed to describe commonly used atomic scale simulation methods, i.e. density functional theory, molecular dynamics, Monte Carlo methods, etc. ASMO uses the Provenance Ontology (PROV-O) to describe the simulation process. + Atomistic Simulation Methods Ontology (ASMO) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Examples of a Contributor include a person, an organization, or a service. Typically, the name of a Contributor should be used to indicate the entity. + Contributor + An entity responsible for making contributions to the resource. + + + + + + + + + Examples of a Creator include a person, an organization, or a service. Typically, the name of a Creator should be used to indicate the entity. + Creator + An entity primarily responsible for making the resource. + + + + + + + + + + + Description may include but is not limited to: an abstract, a table of contents, a graphical representation, or a free-text account of the resource. + Description + An account of the resource. + + + + + + + + + Title + A name given to the resource. + In current practice, this term is used primarily with literal values; however, there are important uses with non-literal values as well. As of December 2007, the DCMI Usage Board is leaving this range unspecified pending an investigation of options. + + + + + + + + + The range of skos:altLabel is the class of RDF plain literals. + skos:prefLabel, skos:altLabel and skos:hiddenLabel are pairwise disjoint properties. + + alternative label + An alternative lexical label for a resource. + Acronyms, abbreviations, spelling variants, and irregular plural/singular forms may be included among the alternative labels for a concept. Mis-spelled terms are normally included as hidden labels (see skos:hiddenLabel). + + + + + + + + + + definition + A statement or formal explanation of the meaning of a concept. + + + + + + + + + + example + An example of the use of a concept. + + + + + + + + + A general note, for any purpose. + + + + + + + + A resource has no more than one value of skos:prefLabel per language tag, and no more than one value of skos:prefLabel without language tag. + The range of skos:prefLabel is the class of RDF plain literals. + skos:prefLabel, skos:altLabel and skos:hiddenLabel are pairwise + disjoint properties. + + preferred label + The preferred lexical label for a resource, in a given language. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + has computational method + + + + + + + + + + has input parameter + + + + + + + + + + has interatomic potential + + + + + + + + + + has relaxation DOF + + + + + + + + + + + + + + + + + + has statistical ensemble + + + + + + + + + + has unit + + + + + + + + + + was calculated by + + + + + + + + + + + An object property to express the accountability of an agent towards another agent. The subordinate agent acted on behalf of the responsible agent in an actual activity. + + actedOnBehalfOf + starting-point + agents-responsibility + hadDelegate + + + + + + + + + + + + + + + generated + expanded + entities-activities + prov:generated is one of few inverse property defined, to allow Activity-oriented assertions in addition to Entity-oriented assertions. + wasGeneratedBy + + + + + + + + + + + influenced + expanded + agents-responsibility + wasInfluencedBy + + + + + + + + + + + + A prov:Entity that was used by this prov:Activity. For example, :baking prov:used :spoon, :egg, :oven . + + used + starting-point + entities-activities + wasUsedBy + + + + + + + + + + + + + An prov:Agent that had some (unspecified) responsibility for the occurrence of this prov:Activity. + + wasAssociatedWith + starting-point + agents-responsibility + wasAssociateFor + + + + + + + + + + + + + Attribution is the ascribing of an entity to an agent. + + wasAttributedTo + starting-point + agents-responsibility + Attribution is the ascribing of an entity to an agent. + contributed + + + + + + + + Attribution is a particular case of trace (see http://www.w3.org/TR/prov-dm/#concept-trace), in the sense that it links an entity to the agent that ascribed it. + IF wasAttributedTo(e2,ag1,aAttr) holds, THEN wasInfluencedBy(e2,ag1) also holds. + + + + + + + + + + + The more specific subproperties of prov:wasDerivedFrom (i.e., prov:wasQuotedFrom, prov:wasRevisionOf, prov:hadPrimarySource) should be used when applicable. + + wasDerivedFrom + starting-point + derivations + A derivation is a transformation of an entity into another, an update of an entity resulting in a new one, or the construction of a new entity based on a pre-existing entity. + hadDerivation + + + + + + + + Derivation is a particular case of trace (see http://www.w3.org/TR/prov-dm/#term-trace), since it links an entity to another entity that contributed to its existence. + + + + + + + + + + + + wasGeneratedBy + starting-point + entities-activities + generated + + + + + + + + + + + + + + + + + + + + + + + + + + + + Because prov:wasInfluencedBy is a broad relation, its more specific subproperties (e.g. prov:wasInformedBy, prov:actedOnBehalfOf, prov:wasEndedBy, etc.) should be used when applicable. + This property has multiple RDFS domains to suit multiple OWL Profiles. See <a href="#owl-profile">PROV-O OWL Profile</a>. + + wasInfluencedBy + qualified + agents-responsibility + The sub-properties of prov:wasInfluencedBy can be elaborated in more detail using the Qualification Pattern. For example, the binary relation :baking prov:used :spoon can be qualified by asserting :baking prov:qualifiedUsage [ a prov:Usage; prov:entity :spoon; prov:atLocation :kitchen ] . + +Subproperties of prov:wasInfluencedBy may also be asserted directly without being qualified. + +prov:wasInfluencedBy should not be used without also using one of its subproperties. + + influenced + + + + + + + + + + + + + + + + + influencee: an identifier (o2) for an entity, activity, or agent; + http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-influence + + + + + + + + + + + + + + influencer: an identifier (o1) for an ancestor entity, activity, or agent that the former depends on; + http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-influence + + + + + + + + + + + An activity a2 is dependent on or informed by another activity a1, by way of some unspecified entity that is generated by a1 and used by a2. + + wasInformedBy + starting-point + entities-activities + informed + + + + + + + + + + + + + hasXCFunctional represents the relationship between a density functional theory method and the exchange-correlation energy functionals it takes. + has XC functional + + + + + + + + + + + + + has value + + + + + + + + + + has reference + A data property linking an entity with a reference (e.g. bibliographic) to another resource. + + + + + + + + + + The time at which an activity ended. See also prov:startedAtTime. + + endedAtTime + starting-point + entities-activities + It is the intent that the property chain holds: (prov:qualifiedEnd o prov:atTime) rdfs:subPropertyOf prov:endedAtTime. + + + + + + + + + + + + The time at which an activity started. See also prov:endedAtTime. + + startedAtTime + starting-point + entities-activities + It is the intent that the property chain holds: (prov:qualifiedStart o prov:atTime) rdfs:subPropertyOf prov:startedAtTime. + + + + + + + + + + + + + + + + Ab Initio Molecular Dynamics + + + + + + + + Computational Method + + + + + + + + + + Density Functional Theory + + + + + + + + + Embedded Atom Model + EAM + + + + + + + + + Energy Difference Calculation + + + + + + + + Input Parameter + + + + + + + + Interatomic Potential + + + + + + + + + Kinetic Monte Carlo Method + + + + + + + + + Lennard-Jones Potential + + + + + + + + + Machine Learning Potential + + + + + + + + + Modified Embedded Atom Model + MEAM + + + + + + + + + Molecular Dynamics + + + + + + + + + Monte Carlo Method + + + + + + + + Relaxation Degrees of Freedom + RelaxationDOF + + + + + + + + Statistical Ensemble + + + + + + + + + Structure Optimization + + + + + + + + Calculated Property + A calculated property is a property of a material resulting from a calculation or simulation. + + + + + + + + A unit of measure, or unit, is a particular quantity value that has been chosen as a scale for measuring other quantities the same kind (more generally of equivalent dimension). For example, the meter is a quantity of length that has been rigorously defined and standardized by the BIPM (International Board of Weights and Measures). Any measurement of the length can be expressed as a number multiplied by the unit meter. More formally, the value of a physical quantity Q with respect to a unit (U) is expressed as the scalar multiple of a real number (n) and U, as \(Q = nU\). + + Unit + + + + + + + + + + Activity + starting-point + entities-activities + http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig + An activity is something that occurs over a period of time and acts upon or with entities; it may include consuming, processing, transforming, modifying, relocating, using, or generating entities. + http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-Activity + http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Activity + + + + + + + + + Agent + starting-point + agents-responsibility + An agent is something that bears some form of responsibility for an activity taking place, for the existence of an entity, or for another agent's activity. + http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-agent + http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Agent + + + + + + + + + Entity + starting-point + entities-activities + http://www.w3.org/TR/2013/REC-prov-constraints-20130430/#prov-dm-constraints-fig + An entity is a physical, digital, conceptual, or other kind of thing with some fixed aspects; entities may be real or imaginary. + http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-entity + http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-Entity + + + + + + + + + + Organization + expanded + agents-responsibility + An organization is a social or legal institution such as a company, society, etc. + http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-agent + http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-types + + + + + + + + + + Person + expanded + agents-responsibility + Person agents are people. + http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-agent + http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-types + + + + + + + + + + SoftwareAgent + expanded + agents-responsibility + A software agent is running software. + http://www.w3.org/TR/2013/REC-prov-dm-20130430/#term-agent + http://www.w3.org/TR/2013/REC-prov-n-20130430/#expression-types + + + + + + + + + + + + + + + + + + + + + + A DFT method is a computational quantum mechanical modelling method used to investigate the electronic structure based on optimization of the energy over electronic densities. + Density Functional Theory Method + + + + + + + + An ExchangeCorrelationEnergyFunctional is a functional to compute the exchange correlation energy. + Exchange Correlation Energy Functional + + + + + + + + + A GeneralizedGradientApproximation is a classification of exchange correlation energy functionals that only use the local value of the electronic density and its gradient. + Generalized Gradient Approximation + + + + + + + + + A hybrid functional is a classification of exchange correlation energy functionals that combine exact exchange from HartreeFock theory with another exchange correlation energy approximation. + Hybrid Functional + + + + + + + + + A hybrid generalized gradient approximation is a classification of exchange correlation energy functionals that combine exact exchange from Hartree–Fock theory with generalized gradient approximation. + Hybrid Generalized Gradient Approximation + + + + + + + + + A hybrid meta generalized gradient approximation is a classification of exchange correlation energy functionals that combine exact exchange from Hartree–Fock theory with meta generalized gradient approximation. + Hybrid Meta Generalized Gradient Approximation + + + + + + + + + A LDA is a classification of exchange correlation energy functionals that only use the local value of the electronic density. + Local Density Approximation + + + + + + + + + A MetaGeneralizedGradientApproximation is a classification of exchange correlation energy functionals that only use the local value of the electronic density and its gradient and the Kohn–Sham orbital kinetic energy density. + Meta Generalized Gradient Approximation + + + + + + + + + + + + + + Atomic Position + + + + + + + + + Canonical Ensemble + + + + + + + + + Cell Shape + + + + + + + + + Cell Volume + + + + + + + + + Grand Canonical Ensemble + + + + + + + + + Microcanonical Ensemble + + + + + + + + + Isoenthalpic–Isobaric Ensemble + + + + + + + + + Isothermal–isobaric Ensemble + + + + + + + diff --git a/pyscal_rdf/data/cmso.owl b/pyscal_rdf/data/cmso.owl index 57004b1..3c471ae 100644 --- a/pyscal_rdf/data/cmso.owl +++ b/pyscal_rdf/data/cmso.owl @@ -231,17 +231,6 @@ - - - - - - has atom - The relation between an atomic scale sample and the atoms it contains. - - - - @@ -322,25 +311,6 @@ - - - - - - - - - - - - - - has position vector - The relation between an atom or basis and its position vector. - - - - @@ -366,10 +336,10 @@ - + has species - The relation between a material and the species that constitutes it. + The relation between a computational sample and the species that constitutes it. @@ -392,6 +362,7 @@ + @@ -514,6 +485,18 @@ + + + + + + abbreviated at.% + has atomic percent + A data property linking a chemical element with atomic percentage present in the material. + + + + @@ -559,24 +542,25 @@ - + - - - - has coordination number - A data property linking an atom with its coordination number. The coordination number of an atom in an extended structure is the number of nearest neighbors. + + + + Indicated with a value from 0 to 1. + has element ratio + A data property linking a chemical element with the ratio or fraction of it in the material. - + - - + + - has element ratio - A data property linking a material with the ratio or fraction of an element that constitutes it. Comment: indicated with a value from 0 to 1. + has identifier + A data property linking an entity with an identifier (internal or external) that represents the entity. @@ -657,6 +641,17 @@ + + + + + + has path + A data property linking an atom attribute (per atom quantity) with the path pointing to the file where the data is stored. + + + + @@ -756,6 +751,18 @@ + + + + + + abbreviated wt.% + has weight percent + A data property linking a chemical element with percentage by mass present in the material. + + + + + + + Atom Attribute + Atom attribute refers to the features or quantities per atom of an atomic scale sample. + + + + + + + + + Atomic Force + Atomic force refers to the vector that represents the force of each atom. + + + + + + + + + Cartesian coordinates are preferred over direct (or fractional) coordinates. + Atomic Position + Atomic position refers to the vector that represents the position of each atom. + + + + @@ -809,6 +846,16 @@ + + + + + Atomic Velocity + Atomic velocity refers to the vector that represents the velocity of each atom. + + + + @@ -827,6 +874,15 @@ + + + + Chemical Composition + Chemical composition refers to the type, arrangement and ratio of the chemical elements of a compound (or material). + + + + @@ -857,6 +913,17 @@ + + + + + In the case of molecules, it refers to the number of atoms, molecules or ions bonded to a central atom of the molecule. Also known as ligancy. + Coordination Number + Coordination number refers to the number of neighbors of each atom. + + + + @@ -1013,13 +1080,13 @@ - + - - - Cartesian coordinates are preferred over direct (or fractional) coordinates. - Position Vector - The position vector is a vector that represents the position of the atoms. + + + Note the difference from a total ratio or percentage of the occupancy of a site in the crystal structure (as defined in CIF) + Occupancy + Occupancy refers to the atom type at each lattice site. From d20aac2d5f2912ba3f115ac21aa7835eb2b6f9dc Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Fri, 8 Dec 2023 13:02:11 +0100 Subject: [PATCH 43/47] update ontology mappings --- pyscal_rdf/network/ontology.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/pyscal_rdf/network/ontology.py b/pyscal_rdf/network/ontology.py index 5e86ecb..650e2bf 100644 --- a/pyscal_rdf/network/ontology.py +++ b/pyscal_rdf/network/ontology.py @@ -10,11 +10,10 @@ def read_ontology(): cmso = OntologyNetwork(os.path.join(file_location, 'data/cmso.owl')) pldo = OntologyNetwork(os.path.join(file_location, 'data/pldo.owl')) podo = OntologyNetwork(os.path.join(file_location, 'data/podo.owl')) - #msmo = OntologyNetwork(os.path.join(file_location, 'data/msmo.owl')) + asmo = OntologyNetwork(os.path.join(file_location, 'data/asmo.owl')) - #combine them - #combo = cmso + pldo + podo + msmo - combo = cmso + pldo + podo + #combine them + combo = cmso + pldo + podo + asmo #add namespaces combo.add_namespace('prov', 'http://www.w3.org/ns/prov#') @@ -40,10 +39,9 @@ def read_ontology(): combo.add_path(('cmso:SimulationCell', 'podo:hasNumberOfVacancies', 'int')) combo.add_path(('cmso:ComputationalSample', 'prov:wasDerivedFrom', 'cmso:ComputationalSample')) combo.add_path(('cmso:ComputationalSample', 'rdf:type', 'prov:Entity')) - #combo.add_path(('aso:StructureOptimization', 'rdf:type', 'prov:Activity')) - #combo.add_path(('aso:StructureOptimization', 'prov:wasAssociatedWith', 'prov:SoftwareAgent')) - #combo.add_path(('cmso:ComputationalSample', 'prov:wasGeneratedBy', 'aso:StructureOptimization')) - + combo.add_path(('asmo:StructureOptimization', 'rdf:type', 'prov:Activity')) + combo.add_path(('asmo:StructureOptimization', 'prov:wasAssociatedWith', 'prov:SoftwareAgent')) + combo.add_path(('cmso:ComputationalSample', 'prov:wasGeneratedBy', 'asmo:StructureOptimization')) #return return combo \ No newline at end of file From 514cfccb90d5ef3098f1874d3eb09f9f0d79b552 Mon Sep 17 00:00:00 2001 From: Sarath Menon Date: Fri, 8 Dec 2023 13:16:16 +0100 Subject: [PATCH 44/47] update docs --- examples/01_getting_started.ipynb | 7279 ++++++++++++---------------- examples/02_grain_boundaries.ipynb | 52 +- 2 files changed, 3048 insertions(+), 4283 deletions(-) diff --git a/examples/01_getting_started.ipynb b/examples/01_getting_started.ipynb index 52283a3..4fae09b 100644 --- a/examples/01_getting_started.ipynb +++ b/examples/01_getting_started.ipynb @@ -114,1049 +114,976 @@ "\n", "\n", - "\n", "\n", - "\n", + "\n", "\n", - "\n", - "\n", + "\n", + "\n", "\n", - "SimulationCell_1Length\n", - "\n", - "SimulationCell_1Length\n", + "sample_1_SimulationCell\n", + "\n", + "sample_1_SimulationCell\n", "\n", - "\n", + "\n", "\n", - "48d2c363-3ee1-4f79-953f-71d4b7d38c77\n", - "\n", - "2.87\n", + "sample_1_SimulationCellVector_1\n", + "\n", + "sample_1_SimulationCellVector_1\n", "\n", - "\n", + "\n", "\n", - "SimulationCell_1Length->48d2c363-3ee1-4f79-953f-71d4b7d38c77\n", - "\n", - "\n", - "cmso.hasLength_x\n", + "sample_1_SimulationCell->sample_1_SimulationCellVector_1\n", + "\n", + "\n", + "cmso.hasVector\n", "\n", - "\n", - "\n", - "453b511f-5077-4950-9fd2-c053ff17f3aa\n", - "\n", - "2.87\n", - "\n", - "\n", - "\n", - "SimulationCell_1Length->453b511f-5077-4950-9fd2-c053ff17f3aa\n", - "\n", - "\n", - "cmso.hasLength_y\n", + "\n", + "\n", + "sample_1_SimulationCellAngle\n", + "\n", + "sample_1_SimulationCellAngle\n", "\n", - "\n", - "\n", - "cmso.SimulationCellLength\n", - "\n", - "cmso.SimulationCellLength\n", + "\n", + "\n", + "sample_1_SimulationCell->sample_1_SimulationCellAngle\n", + "\n", + "\n", + "cmso.hasAngle\n", "\n", - "\n", - "\n", - "SimulationCell_1Length->cmso.SimulationCellLength\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1_SimulationCellVector_2\n", + "\n", + "sample_1_SimulationCellVector_2\n", "\n", - "\n", - "\n", - "a0f55cb6-28e5-49e6-a533-e2cf279d7646\n", - "\n", - "2.87\n", + "\n", + "\n", + "sample_1_SimulationCell->sample_1_SimulationCellVector_2\n", + "\n", + "\n", + "cmso.hasVector\n", "\n", - "\n", - "\n", - "SimulationCell_1Length->a0f55cb6-28e5-49e6-a533-e2cf279d7646\n", - "\n", - "\n", - "cmso.hasLength_z\n", + "\n", + "\n", + "sample_1_SimulationCellVector_3\n", + "\n", + "sample_1_SimulationCellVector_3\n", "\n", - "\n", - "\n", - "cmso.SimulationCellAngle\n", - "\n", - "cmso.SimulationCellAngle\n", + "\n", + "\n", + "sample_1_SimulationCell->sample_1_SimulationCellVector_3\n", + "\n", + "\n", + "cmso.hasVector\n", "\n", - "\n", - "\n", - "cmso.Angle\n", - "\n", - "cmso.Angle\n", + "\n", + "\n", + "sample_1_SimulationCellLength\n", + "\n", + "sample_1_SimulationCellLength\n", "\n", - "\n", - "\n", - "cmso.SimulationCellAngle->cmso.Angle\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "sample_1_SimulationCell->sample_1_SimulationCellLength\n", + "\n", + "\n", + "cmso.hasLength\n", "\n", - "\n", + "\n", "\n", - "DEG\n", - "\n", - "DEG\n", + "cmso.SimulationCell\n", + "\n", + "cmso.SimulationCell\n", "\n", - "\n", - "\n", - "cmso.Angle->DEG\n", - "\n", - "\n", - "cmso.hasUnit\n", + "\n", + "\n", + "sample_1_SimulationCell->cmso.SimulationCell\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_1_1_Position\n", - "\n", - "Atom_1_1_Position\n", + "\n", + "\n", + "c98da728-93a4-437d-bf72-41c9348e491b\n", + "\n", + "1512.95\n", "\n", - "\n", - "\n", - "435038de-d92c-4948-89fd-5b8b13377dc3\n", - "\n", - "1.435\n", + "\n", + "\n", + "sample_1_SimulationCell->c98da728-93a4-437d-bf72-41c9348e491b\n", + "\n", + "\n", + "cmso.hasVolume\n", "\n", - "\n", - "\n", - "Atom_1_1_Position->435038de-d92c-4948-89fd-5b8b13377dc3\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "cmso.SimulationCellVector\n", + "\n", + "cmso.SimulationCellVector\n", "\n", - "\n", - "\n", - "ad7cb0c5-3cc3-40d7-871f-a4752b6fa6b4\n", - "\n", - "1.435\n", + "\n", + "\n", + "sample_1_SimulationCellVector_1->cmso.SimulationCellVector\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_1_1_Position->ad7cb0c5-3cc3-40d7-871f-a4752b6fa6b4\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "\n", + "\n", + "865995bd-6362-4a48-97d0-4072beac9757\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "cmso.PositionVector\n", - "\n", - "cmso.PositionVector\n", + "\n", + "\n", + "sample_1_SimulationCellVector_1->865995bd-6362-4a48-97d0-4072beac9757\n", + "\n", + "\n", + "cmso.hasComponent_y\n", "\n", - "\n", - "\n", - "Atom_1_1_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "ebce2d62-9366-4922-bb67-f9de019d582f\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "b24578c5-ceae-480d-804c-f2bd485bd6b8\n", - "\n", - "1.435\n", + "\n", + "\n", + "sample_1_SimulationCellVector_1->ebce2d62-9366-4922-bb67-f9de019d582f\n", + "\n", + "\n", + "cmso.hasComponent_z\n", "\n", - "\n", - "\n", - "Atom_1_1_Position->b24578c5-ceae-480d-804c-f2bd485bd6b8\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "5a0d153b-23a5-4495-a772-b14152860bfe\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeAngle\n", - "\n", - "UnitCell_1LatticeAngle\n", + "\n", + "\n", + "sample_1_SimulationCellVector_1->5a0d153b-23a5-4495-a772-b14152860bfe\n", + "\n", + "\n", + "cmso.hasComponent_x\n", "\n", - "\n", - "\n", - "0967e175-9673-4868-8fc0-84034983f39f\n", - "\n", - "90\n", + "\n", + "\n", + "sample_1_CrystalStructure\n", + "\n", + "sample_1_CrystalStructure\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeAngle->0967e175-9673-4868-8fc0-84034983f39f\n", - "\n", - "\n", - "cmso.hasAngle_alpha\n", + "\n", + "\n", + "d5f68373-47d6-441e-85e7-6dd4c0479d6b\n", + "\n", + "Im-3M\n", "\n", - "\n", + "\n", + "\n", + "sample_1_CrystalStructure->d5f68373-47d6-441e-85e7-6dd4c0479d6b\n", + "\n", + "\n", + "cmso.hasSpaceGroupSymbol\n", + "\n", + "\n", "\n", - "cmso.LatticeAngle\n", - "\n", - "cmso.LatticeAngle\n", + "cmso.CrystalStructure\n", + "\n", + "cmso.CrystalStructure\n", "\n", - "\n", + "\n", "\n", - "UnitCell_1LatticeAngle->cmso.LatticeAngle\n", - "\n", - "\n", - "type\n", + "sample_1_CrystalStructure->cmso.CrystalStructure\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "587320d9-3ed4-4efc-b172-92755b614a2d\n", - "\n", - "90\n", + "\n", + "\n", + "sample_1_UnitCell\n", + "\n", + "sample_1_UnitCell\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeAngle->587320d9-3ed4-4efc-b172-92755b614a2d\n", - "\n", - "\n", - "cmso.hasAngle_gamma\n", + "\n", + "\n", + "sample_1_CrystalStructure->sample_1_UnitCell\n", + "\n", + "\n", + "cmso.hasUnitCell\n", "\n", - "\n", - "\n", - "9cbcffcd-202f-4bd9-8090-ba35352e6ffe\n", - "\n", - "90\n", + "\n", + "\n", + "6040c458-4081-45b7-be5d-e0a701526203\n", + "\n", + "Bcc\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeAngle->9cbcffcd-202f-4bd9-8090-ba35352e6ffe\n", - "\n", - "\n", - "cmso.hasAngle_beta\n", + "\n", + "\n", + "sample_1_CrystalStructure->6040c458-4081-45b7-be5d-e0a701526203\n", + "\n", + "\n", + "cmso.hasAltName\n", "\n", - "\n", - "\n", - "cmso.LatticeAngle->cmso.Angle\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "c416e453-b1e7-44db-b50f-cab9f8c735fc\n", + "\n", + "229\n", "\n", - "\n", - "\n", - "cmso.LatticeParameter\n", - "\n", - "cmso.LatticeParameter\n", + "\n", + "\n", + "sample_1_CrystalStructure->c416e453-b1e7-44db-b50f-cab9f8c735fc\n", + "\n", + "\n", + "cmso.hasSpaceGroupNumber\n", "\n", - "\n", - "\n", - "cmso.Length\n", - "\n", - "cmso.Length\n", + "\n", + "\n", + "sample_1_Species\n", + "\n", + "sample_1_Species\n", "\n", - "\n", - "\n", - "cmso.LatticeParameter->cmso.Length\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "cce213ce-e2e9-4e48-9a6b-cc47db9cc06e\n", + "\n", + "Rdf_Structure_Store/1.Json\n", "\n", - "\n", - "\n", - "ANGSTROM\n", - "\n", - "ANGSTROM\n", + "\n", + "\n", + "sample_1_Species->cce213ce-e2e9-4e48-9a6b-cc47db9cc06e\n", + "\n", + "\n", + "cmso.hasPath\n", "\n", - "\n", - "\n", - "cmso.Length->ANGSTROM\n", - "\n", - "\n", - "cmso.hasUnit\n", + "\n", + "\n", + "cmso.AtomAttribute\n", + "\n", + "cmso.AtomAttribute\n", "\n", - "\n", - "\n", - "Sample_1\n", - "\n", - "Sample_1\n", + "\n", + "\n", + "sample_1_Species->cmso.AtomAttribute\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_1_0\n", - "\n", - "Atom_1_0\n", + "\n", + "\n", + "55097bde-e117-4b24-b0ee-17848cd2a1d2\n", + "\n", + "Ce0Debfc-1D4B-4764-8B94-77B47F48D422\n", "\n", - "\n", - "\n", - "Sample_1->Atom_1_0\n", - "\n", - "\n", - "cmso.hasAtom\n", + "\n", + "\n", + "sample_1_Species->55097bde-e117-4b24-b0ee-17848cd2a1d2\n", + "\n", + "\n", + "cmso.hasIdentifier\n", "\n", - "\n", - "\n", - "cmso.AtomicScaleSample\n", - "\n", - "cmso.AtomicScaleSample\n", + "\n", + "\n", + "f105f641-3945-4f65-bbd1-f8a29f67f932\n", + "\n", + "Species\n", "\n", - "\n", - "\n", - "Sample_1->cmso.AtomicScaleSample\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1_Species->f105f641-3945-4f65-bbd1-f8a29f67f932\n", + "\n", + "\n", + "cmso.hasName\n", "\n", - "\n", - "\n", - "SimulationCell_1\n", - "\n", - "SimulationCell_1\n", + "\n", + "\n", + "sample_1_LatticeParameter\n", + "\n", + "sample_1_LatticeParameter\n", "\n", - "\n", - "\n", - "Sample_1->SimulationCell_1\n", - "\n", - "\n", - "cmso.hasSimulationCell\n", + "\n", + "\n", + "76387bd6-9993-422f-b505-93836133874b\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "Material_1\n", - "\n", - "Material_1\n", + "\n", + "\n", + "sample_1_LatticeParameter->76387bd6-9993-422f-b505-93836133874b\n", + "\n", + "\n", + "cmso.hasLength_x\n", "\n", - "\n", - "\n", - "Sample_1->Material_1\n", - "\n", - "\n", - "cmso.hasMaterial\n", + "\n", + "\n", + "cmso.LatticeParameter\n", + "\n", + "cmso.LatticeParameter\n", "\n", - "\n", - "\n", - "Atom_1_1\n", - "\n", - "Atom_1_1\n", + "\n", + "\n", + "sample_1_LatticeParameter->cmso.LatticeParameter\n", + "\n", + "\n", + "type\n", "\n", - "\n", + "\n", + "\n", + "9adb3c70-7ff6-49bd-8ea9-7c7af8d015b3\n", + "\n", + "2.87\n", + "\n", + "\n", "\n", - "Sample_1->Atom_1_1\n", - "\n", - "\n", - "cmso.hasAtom\n", + "sample_1_LatticeParameter->9adb3c70-7ff6-49bd-8ea9-7c7af8d015b3\n", + "\n", + "\n", + "cmso.hasLength_y\n", "\n", - "\n", - "\n", - "d406b91d-c313-42fd-9cd1-790c81bd9483\n", - "\n", - "2\n", + "\n", + "\n", + "49edef01-b597-48b8-bc1f-a6eba4788cc1\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "Sample_1->d406b91d-c313-42fd-9cd1-790c81bd9483\n", - "\n", - "\n", - "cmso.hasNumberOfAtoms\n", + "\n", + "\n", + "sample_1_LatticeParameter->49edef01-b597-48b8-bc1f-a6eba4788cc1\n", + "\n", + "\n", + "cmso.hasLength_z\n", "\n", - "\n", - "\n", - "Atom_1_0_Position\n", - "\n", - "Atom_1_0_Position\n", + "\n", + "\n", + "sample_1_UnitCell->sample_1_LatticeParameter\n", + "\n", + "\n", + "cmso.hasLatticeParamter\n", "\n", - "\n", - "\n", - "Atom_1_0->Atom_1_0_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", + "\n", + "\n", + "sample_1_LatticeAngle\n", + "\n", + "sample_1_LatticeAngle\n", "\n", - "\n", - "\n", - "cmso.Atom\n", - "\n", - "cmso.Atom\n", + "\n", + "\n", + "sample_1_UnitCell->sample_1_LatticeAngle\n", + "\n", + "\n", + "cmso.hasAngle\n", "\n", - "\n", - "\n", - "Atom_1_0->cmso.Atom\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "wiki.Q851536\n", + "\n", + "wiki.Q851536\n", "\n", - "\n", - "\n", - "Atom_1_0_Element\n", - "\n", - "Atom_1_0_Element\n", + "\n", + "\n", + "sample_1_UnitCell->wiki.Q851536\n", + "\n", + "\n", + "cmso.hasBravaisLattice\n", "\n", - "\n", - "\n", - "Atom_1_0->Atom_1_0_Element\n", - "\n", - "\n", - "cmso.hasElement\n", + "\n", + "\n", + "cmso.UnitCell\n", + "\n", + "cmso.UnitCell\n", "\n", - "\n", - "\n", - "862ae50f-66eb-4cde-b4cd-7ec855008146\n", - "\n", - "14\n", + "\n", + "\n", + "sample_1_UnitCell->cmso.UnitCell\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_1_0->862ae50f-66eb-4cde-b4cd-7ec855008146\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", + "\n", + "\n", + "sample_1_Position\n", + "\n", + "sample_1_Position\n", "\n", - "\n", - "\n", - "UnitCell_1\n", - "\n", - "UnitCell_1\n", + "\n", + "\n", + "6d6cf958-fc5b-48bd-a416-9d6f2142b1c6\n", + "\n", + "Position\n", "\n", - "\n", - "\n", - "UnitCell_1->UnitCell_1LatticeAngle\n", - "\n", - "\n", - "cmso.hasAngle\n", + "\n", + "\n", + "sample_1_Position->6d6cf958-fc5b-48bd-a416-9d6f2142b1c6\n", + "\n", + "\n", + "cmso.hasName\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeParameter\n", - "\n", - "UnitCell_1LatticeParameter\n", + "\n", + "\n", + "3729f05e-7dc8-4a66-8aba-9df6200cee37\n", + "\n", + "Rdf_Structure_Store/1.Json\n", "\n", - "\n", - "\n", - "UnitCell_1->UnitCell_1LatticeParameter\n", - "\n", - "\n", - "cmso.hasLatticeParamter\n", + "\n", + "\n", + "sample_1_Position->3729f05e-7dc8-4a66-8aba-9df6200cee37\n", + "\n", + "\n", + "cmso.hasPath\n", "\n", - "\n", - "\n", - "cmso.UnitCell\n", - "\n", - "cmso.UnitCell\n", + "\n", + "\n", + "128789f9-d54c-4f1d-a6e4-f67beed16151\n", + "\n", + "3D81Bcb3-7B80-44F9-A30E-627166242012\n", "\n", - "\n", - "\n", - "UnitCell_1->cmso.UnitCell\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1_Position->128789f9-d54c-4f1d-a6e4-f67beed16151\n", + "\n", + "\n", + "cmso.hasIdentifier\n", "\n", - "\n", - "\n", - "wiki.Q851536\n", - "\n", - "wiki.Q851536\n", + "\n", + "\n", + "sample_1_Position->cmso.AtomAttribute\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "UnitCell_1->wiki.Q851536\n", - "\n", - "\n", - "cmso.hasBravaisLattice\n", + "\n", + "\n", + "sample_1\n", + "\n", + "sample_1\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeParameter->cmso.LatticeParameter\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1->sample_1_SimulationCell\n", + "\n", + "\n", + "cmso.hasSimulationCell\n", "\n", - "\n", - "\n", - "87809618-1f00-448f-9b86-470d3d6b488a\n", - "\n", - "2.87\n", + "\n", + "\n", + "sample_1->sample_1_Species\n", + "\n", + "\n", + "cmso.hasAttribute\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeParameter->87809618-1f00-448f-9b86-470d3d6b488a\n", - "\n", - "\n", - "cmso.hasLength_z\n", + "\n", + "\n", + "sample_1->sample_1_Position\n", + "\n", + "\n", + "cmso.hasAttribute\n", "\n", - "\n", - "\n", - "2241cf8c-5625-495a-9958-c0aa70288628\n", - "\n", - "2.87\n", + "\n", + "\n", + "sample_1_ChemicalSpecies\n", + "\n", + "sample_1_ChemicalSpecies\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeParameter->2241cf8c-5625-495a-9958-c0aa70288628\n", - "\n", - "\n", - "cmso.hasLength_y\n", + "\n", + "\n", + "sample_1->sample_1_ChemicalSpecies\n", + "\n", + "\n", + "cmso.hasSpecies\n", "\n", - "\n", - "\n", - "250392d7-0b58-4567-b4bd-31d2c6bf6a8d\n", - "\n", - "2.87\n", + "\n", + "\n", + "245e522a-6b88-4093-849d-a56e4bb32488\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeParameter->250392d7-0b58-4567-b4bd-31d2c6bf6a8d\n", - "\n", - "\n", - "cmso.hasLength_x\n", + "\n", + "\n", + "sample_1->245e522a-6b88-4093-849d-a56e4bb32488\n", + "\n", + "\n", + "cmso.hasNumberOfAtoms\n", "\n", - "\n", - "\n", - "SimulationCell_1Angle\n", - "\n", - "SimulationCell_1Angle\n", + "\n", + "\n", + "sample_1_Material\n", + "\n", + "sample_1_Material\n", "\n", - "\n", - "\n", - "SimulationCell_1Angle->cmso.SimulationCellAngle\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1->sample_1_Material\n", + "\n", + "\n", + "cmso.hasMaterial\n", "\n", - "\n", - "\n", - "9e25745c-61c0-496c-b6b5-ccda71dcfce7\n", - "\n", - "90.0\n", + "\n", + "\n", + "cmso.AtomicScaleSample\n", + "\n", + "cmso.AtomicScaleSample\n", "\n", - "\n", - "\n", - "SimulationCell_1Angle->9e25745c-61c0-496c-b6b5-ccda71dcfce7\n", - "\n", - "\n", - "cmso.hasAngle_alpha\n", + "\n", + "\n", + "sample_1->cmso.AtomicScaleSample\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "1146f809-d0cc-40b0-99d3-b531a14f1dfe\n", - "\n", - "90.0\n", + "\n", + "\n", + "b2f58529-e052-4965-af1f-0a24e27e0b78\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "SimulationCell_1Angle->1146f809-d0cc-40b0-99d3-b531a14f1dfe\n", - "\n", - "\n", - "cmso.hasAngle_gamma\n", + "\n", + "\n", + "sample_1_SimulationCellAngle->b2f58529-e052-4965-af1f-0a24e27e0b78\n", + "\n", + "\n", + "cmso.hasAngle_beta\n", "\n", - "\n", - "\n", - "ac35205c-f1f7-4ead-bdea-c4a7b10f44ab\n", - "\n", - "90.0\n", + "\n", + "\n", + "cmso.SimulationCellAngle\n", + "\n", + "cmso.SimulationCellAngle\n", "\n", - "\n", - "\n", - "SimulationCell_1Angle->ac35205c-f1f7-4ead-bdea-c4a7b10f44ab\n", - "\n", - "\n", - "cmso.hasAngle_beta\n", + "\n", + "\n", + "sample_1_SimulationCellAngle->cmso.SimulationCellAngle\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector02\n", - "\n", - "SimulationCell_1Vector02\n", + "\n", + "\n", + "0c3d07b6-7f07-4dc3-9c3c-ed54da72012b\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "214b9463-2ec0-435f-ba9f-ed3d870ac89a\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_1_SimulationCellAngle->0c3d07b6-7f07-4dc3-9c3c-ed54da72012b\n", + "\n", + "\n", + "cmso.hasAngle_alpha\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector02->214b9463-2ec0-435f-ba9f-ed3d870ac89a\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "d271e2f1-4276-4ac1-903a-798170881751\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "cmso.SimulationCellVector\n", - "\n", - "cmso.SimulationCellVector\n", + "\n", + "\n", + "sample_1_SimulationCellAngle->d271e2f1-4276-4ac1-903a-798170881751\n", + "\n", + "\n", + "cmso.hasAngle_gamma\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector02->cmso.SimulationCellVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "5e736582-73f4-490f-81db-07a3a9f069ca\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "df3dd6c8-0e83-429e-8595-06b96be86aba\n", - "\n", - "2.87\n", + "\n", + "\n", + "sample_1_SimulationCellVector_2->5e736582-73f4-490f-81db-07a3a9f069ca\n", + "\n", + "\n", + "cmso.hasComponent_z\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector02->df3dd6c8-0e83-429e-8595-06b96be86aba\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "sample_1_SimulationCellVector_2->cmso.SimulationCellVector\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "9f81ac46-6b9c-47c5-bbba-6899d7f4aacd\n", - "\n", - "0.0\n", + "\n", + "\n", + "2f4543ec-e2d3-4220-a2db-ed37e5a25cfb\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector02->9f81ac46-6b9c-47c5-bbba-6899d7f4aacd\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "\n", + "\n", + "sample_1_SimulationCellVector_2->2f4543ec-e2d3-4220-a2db-ed37e5a25cfb\n", + "\n", + "\n", + "cmso.hasComponent_y\n", "\n", - "\n", - "\n", - "CrystalStructure_1\n", - "\n", - "CrystalStructure_1\n", + "\n", + "\n", + "f94667ad-d5bc-4c64-85f7-a3bf82235471\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "CrystalStructure_1->UnitCell_1\n", - "\n", - "\n", - "cmso.hasUnitCell\n", + "\n", + "\n", + "sample_1_SimulationCellVector_2->f94667ad-d5bc-4c64-85f7-a3bf82235471\n", + "\n", + "\n", + "cmso.hasComponent_x\n", "\n", - "\n", - "\n", - "04f0a7c9-360d-4f55-ba27-02f5b56264a1\n", - "\n", - "Im-3M\n", + "\n", + "\n", + "f8adeb57-250e-4682-9e9a-a604030dc986\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "CrystalStructure_1->04f0a7c9-360d-4f55-ba27-02f5b56264a1\n", - "\n", - "\n", - "cmso.hasSpaceGroupSymbol\n", + "\n", + "\n", + "sample_1_SimulationCellVector_3->f8adeb57-250e-4682-9e9a-a604030dc986\n", + "\n", + "\n", + "cmso.hasComponent_x\n", "\n", - "\n", - "\n", - "cmso.CrystalStructure\n", - "\n", - "cmso.CrystalStructure\n", + "\n", + "\n", + "sample_1_SimulationCellVector_3->cmso.SimulationCellVector\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "CrystalStructure_1->cmso.CrystalStructure\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "eefe3da3-a7f1-4a22-8a8a-3c0180e364b3\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "672985df-64d6-4b3d-a717-eccd0cc9342e\n", - "\n", - "Bcc\n", + "\n", + "\n", + "sample_1_SimulationCellVector_3->eefe3da3-a7f1-4a22-8a8a-3c0180e364b3\n", + "\n", + "\n", + "cmso.hasComponent_z\n", "\n", - "\n", - "\n", - "CrystalStructure_1->672985df-64d6-4b3d-a717-eccd0cc9342e\n", - "\n", - "\n", - "cmso.hasAltName\n", + "\n", + "\n", + "7d0775e1-614b-4732-8ec1-520e06a3e17a\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "1f303f2b-c1db-4a07-a239-da93e3f8fcaa\n", - "\n", - "229\n", + "\n", + "\n", + "sample_1_SimulationCellVector_3->7d0775e1-614b-4732-8ec1-520e06a3e17a\n", + "\n", + "\n", + "cmso.hasComponent_y\n", "\n", - "\n", - "\n", - "CrystalStructure_1->1f303f2b-c1db-4a07-a239-da93e3f8fcaa\n", - "\n", - "\n", - "cmso.hasSpaceGroupNumber\n", + "\n", + "\n", + "CHEBI.18248\n", + "\n", + "CHEBI.18248\n", "\n", - "\n", - "\n", - "SimulationCell_1->SimulationCell_1Length\n", - "\n", - "\n", - "cmso.hasLength\n", + "\n", + "\n", + "db69df96-34bd-4cb0-bcc4-af8b4a2f8afd\n", + "\n", + "Fe\n", "\n", - "\n", - "\n", - "SimulationCell_1->SimulationCell_1Angle\n", - "\n", - "\n", - "cmso.hasAngle\n", + "\n", + "\n", + "CHEBI.18248->db69df96-34bd-4cb0-bcc4-af8b4a2f8afd\n", + "\n", + "\n", + "cmso.hasSymbol\n", "\n", - "\n", - "\n", - "SimulationCell_1->SimulationCell_1Vector02\n", - "\n", - "\n", - "cmso.hasVector\n", + "\n", + "\n", + "cmso.Element\n", + "\n", + "cmso.Element\n", "\n", - "\n", - "\n", - "cmso.SimulationCell\n", - "\n", - "cmso.SimulationCell\n", + "\n", + "\n", + "CHEBI.18248->cmso.Element\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "SimulationCell_1->cmso.SimulationCell\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "a89f734c-c48c-4df6-8916-306d866c00fa\n", + "\n", + "1.0\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector03\n", - "\n", - "SimulationCell_1Vector03\n", + "\n", + "\n", + "CHEBI.18248->a89f734c-c48c-4df6-8916-306d866c00fa\n", + "\n", + "\n", + "cmso.hasElementRatio\n", "\n", - "\n", - "\n", - "SimulationCell_1->SimulationCell_1Vector03\n", - "\n", - "\n", - "cmso.hasVector\n", - "\n", - "\n", - "\n", - "dd8f58e1-648c-4d3f-9564-0fcc4584fcfc\n", - "\n", - "1512.95\n", - "\n", - "\n", - "\n", - "SimulationCell_1->dd8f58e1-648c-4d3f-9564-0fcc4584fcfc\n", - "\n", - "\n", - "cmso.hasVolume\n", - "\n", - "\n", + "\n", "\n", - "SimulationCell_1Vector01\n", - "\n", - "SimulationCell_1Vector01\n", - "\n", - "\n", - "\n", - "SimulationCell_1->SimulationCell_1Vector01\n", - "\n", - "\n", - "cmso.hasVector\n", + "cmso.Angle\n", + "\n", + "cmso.Angle\n", "\n", - "\n", - "\n", - "cmso.LatticeVector\n", - "\n", - "cmso.LatticeVector\n", + "\n", + "\n", + "cmso.SimulationCellAngle->cmso.Angle\n", + "\n", + "\n", + "subClassOf\n", "\n", "\n", - "\n", + "\n", "cmso.Vector\n", - "\n", - "cmso.Vector\n", + "\n", + "cmso.Vector\n", "\n", - "\n", - "\n", - "cmso.LatticeVector->cmso.Vector\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "cmso.SimulationCellVector->cmso.Vector\n", + "\n", + "\n", + "subClassOf\n", "\n", - "\n", - "\n", - "cmso.Vector->ANGSTROM\n", - "\n", - "\n", - "cmso.hasUnit\n", + "\n", + "\n", + "unit.ANGSTROM\n", + "\n", + "unit.ANGSTROM\n", "\n", - "\n", - "\n", - "Material_1->CrystalStructure_1\n", - "\n", - "\n", - "cmso.hasStructure\n", + "\n", + "\n", + "cmso.Vector->unit.ANGSTROM\n", + "\n", + "\n", + "cmso.hasUnit\n", "\n", - "\n", + "\n", "\n", - "cmso.CrystallineMaterial\n", - "\n", - "cmso.CrystallineMaterial\n", - "\n", - "\n", - "\n", - "Material_1->cmso.CrystallineMaterial\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "c48517cc-088e-4fa7-b4d1-5e4f8257a210\n", - "\n", - "Fe=1.0\n", + "cmso.Length\n", + "\n", + "cmso.Length\n", "\n", - "\n", + "\n", "\n", - "Material_1->c48517cc-088e-4fa7-b4d1-5e4f8257a210\n", - "\n", - "\n", - "cmso.hasElementRatio\n", - "\n", - "\n", - "\n", - "Atom_1_1->Atom_1_1_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", - "\n", - "\n", - "\n", - "Atom_1_1->cmso.Atom\n", - "\n", - "\n", - "type\n", + "cmso.LatticeParameter->cmso.Length\n", + "\n", + "\n", + "subClassOf\n", "\n", - "\n", - "\n", - "Atom_1_1_Element\n", - "\n", - "Atom_1_1_Element\n", + "\n", + "\n", + "cmso.SimulationCellLength\n", + "\n", + "cmso.SimulationCellLength\n", "\n", - "\n", - "\n", - "Atom_1_1->Atom_1_1_Element\n", - "\n", - "\n", - "cmso.hasElement\n", + "\n", + "\n", + "cmso.SimulationCellLength->cmso.Length\n", + "\n", + "\n", + "subClassOf\n", "\n", - "\n", - "\n", - "42d847be-315f-4666-9905-f03941baa592\n", - "\n", - "14\n", + "\n", + "\n", + "cmso.Length->unit.ANGSTROM\n", + "\n", + "\n", + "cmso.hasUnit\n", "\n", - "\n", - "\n", - "Atom_1_1->42d847be-315f-4666-9905-f03941baa592\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", + "\n", + "\n", + "5c11e7d5-0de9-404e-9e22-1ea81bd40e25\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "317bafd2-3165-45a1-af23-133b50e3e43a\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_1_LatticeAngle->5c11e7d5-0de9-404e-9e22-1ea81bd40e25\n", + "\n", + "\n", + "cmso.hasAngle_alpha\n", "\n", - "\n", - "\n", - "Atom_1_0_Position->317bafd2-3165-45a1-af23-133b50e3e43a\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "0db7be35-6292-46ba-b485-494329ce5fb9\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "Atom_1_0_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1_LatticeAngle->0db7be35-6292-46ba-b485-494329ce5fb9\n", + "\n", + "\n", + "cmso.hasAngle_beta\n", "\n", - "\n", - "\n", - "93208c86-8b40-4166-9c25-9f3cd273cf74\n", - "\n", - "0.0\n", + "\n", + "\n", + "cmso.LatticeAngle\n", + "\n", + "cmso.LatticeAngle\n", "\n", - "\n", - "\n", - "Atom_1_0_Position->93208c86-8b40-4166-9c25-9f3cd273cf74\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "\n", + "\n", + "sample_1_LatticeAngle->cmso.LatticeAngle\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "19842b93-6769-479e-afb3-9e665fa3cc74\n", - "\n", - "0.0\n", + "\n", + "\n", + "bda68832-2ec5-4f5a-b7ca-6ff84f8673b5\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "Atom_1_0_Position->19842b93-6769-479e-afb3-9e665fa3cc74\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "sample_1_LatticeAngle->bda68832-2ec5-4f5a-b7ca-6ff84f8673b5\n", + "\n", + "\n", + "cmso.hasAngle_gamma\n", "\n", - "\n", - "\n", - "cmso.SimulationCellVector->cmso.Vector\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "sample_1_SimulationCellLength->cmso.SimulationCellLength\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector03->cmso.SimulationCellVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "e2e97c10-71ad-4145-8a78-5d2deedd6239\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "75c3ecbb-6f35-442e-b4b6-c288dd4a0d48\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_1_SimulationCellLength->e2e97c10-71ad-4145-8a78-5d2deedd6239\n", + "\n", + "\n", + "cmso.hasLength_x\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector03->75c3ecbb-6f35-442e-b4b6-c288dd4a0d48\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "b2773cfd-0473-463e-aa24-26999c2f9891\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "43de97c5-e39e-4f52-afab-eb96a8ee2f94\n", - "\n", - "2.87\n", + "\n", + "\n", + "sample_1_SimulationCellLength->b2773cfd-0473-463e-aa24-26999c2f9891\n", + "\n", + "\n", + "cmso.hasLength_z\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector03->43de97c5-e39e-4f52-afab-eb96a8ee2f94\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "\n", + "\n", + "3d70a636-5214-42d6-a3ee-e6f3707abaf9\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "4168e87e-2fe5-412b-a59b-b596a8f8155e\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_1_SimulationCellLength->3d70a636-5214-42d6-a3ee-e6f3707abaf9\n", + "\n", + "\n", + "cmso.hasLength_y\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector03->4168e87e-2fe5-412b-a59b-b596a8f8155e\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "sample_1_ChemicalSpecies->CHEBI.18248\n", + "\n", + "\n", + "cmso.hasElement\n", "\n", - "\n", - "\n", - "cmso.SimulationCellLength->cmso.Length\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "cmso.ChemicalSpecies\n", + "\n", + "cmso.ChemicalSpecies\n", "\n", - "\n", - "\n", - "cmso.Element\n", - "\n", - "cmso.Element\n", + "\n", + "\n", + "sample_1_ChemicalSpecies->cmso.ChemicalSpecies\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_1_1_Element->cmso.Element\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1_Material->sample_1_CrystalStructure\n", + "\n", + "\n", + "cmso.hasStructure\n", "\n", - "\n", - "\n", - "638147cb-f97c-4f46-97cb-642016cfc467\n", - "\n", - "Fe\n", + "\n", + "\n", + "cmso.CrystallineMaterial\n", + "\n", + "cmso.CrystallineMaterial\n", "\n", - "\n", - "\n", - "Atom_1_1_Element->638147cb-f97c-4f46-97cb-642016cfc467\n", - "\n", - "\n", - "cmso.hasSymbol\n", + "\n", + "\n", + "sample_1_Material->cmso.CrystallineMaterial\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector01->cmso.SimulationCellVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "cmso.LatticeAngle->cmso.Angle\n", + "\n", + "\n", + "subClassOf\n", "\n", - "\n", - "\n", - "917fb750-21d7-4457-bc81-f11d85858166\n", - "\n", - "0.0\n", + "\n", + "\n", + "unit.DEG\n", + "\n", + "unit.DEG\n", "\n", - "\n", + "\n", "\n", - "SimulationCell_1Vector01->917fb750-21d7-4457-bc81-f11d85858166\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "cmso.Angle->unit.DEG\n", + "\n", + "\n", + "cmso.hasUnit\n", "\n", - "\n", - "\n", - "874ccfa8-25e0-4659-9d8f-810d2095827b\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "SimulationCell_1Vector01->874ccfa8-25e0-4659-9d8f-810d2095827b\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "cmso.LatticeVector\n", + "\n", + "cmso.LatticeVector\n", "\n", - "\n", - "\n", - "241a328f-26d4-43b5-8edd-730f96612052\n", - "\n", - "2.87\n", + "\n", + "\n", + "cmso.LatticeVector->cmso.Vector\n", + "\n", + "\n", + "subClassOf\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector01->241a328f-26d4-43b5-8edd-730f96612052\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "cmso.PositionVector\n", + "\n", + "cmso.PositionVector\n", "\n", "\n", - "\n", + "\n", "cmso.PositionVector->cmso.Vector\n", - "\n", - "\n", - "subClassOf\n", - "\n", - "\n", - "\n", - "Atom_1_0_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "89173bfb-81b8-4037-b473-1bfd879e026c\n", - "\n", - "Fe\n", - "\n", - "\n", - "\n", - "Atom_1_0_Element->89173bfb-81b8-4037-b473-1bfd879e026c\n", - "\n", - "\n", - "cmso.hasSymbol\n", + "\n", + "\n", + "subClassOf\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -1221,3750 +1148,2552 @@ "\n", "\n", - "\n", "\n", - "\n", + "\n", "\n", - "\n", - "\n", + "\n", + "\n", "\n", - "SimulationCell_1Length\n", - "\n", - "SimulationCell_1Length\n", + "sample_1_CrystalStructure\n", + "\n", + "sample_1_CrystalStructure\n", "\n", - "\n", + "\n", "\n", - "510dbf87-1425-4364-97b3-7ec7888a3323\n", - "\n", - "2.87\n", + "753da84d-a542-4ebc-8663-826fc95532b5\n", + "\n", + "Im-3M\n", "\n", - "\n", + "\n", "\n", - "SimulationCell_1Length->510dbf87-1425-4364-97b3-7ec7888a3323\n", - "\n", - "\n", - "cmso.hasLength_x\n", + "sample_1_CrystalStructure->753da84d-a542-4ebc-8663-826fc95532b5\n", + "\n", + "\n", + "cmso.hasSpaceGroupSymbol\n", "\n", - "\n", - "\n", - "cmso.SimulationCellLength\n", - "\n", - "cmso.SimulationCellLength\n", + "\n", + "\n", + "54af2219-461b-4fbf-b71d-fcc788131f81\n", + "\n", + "Bcc\n", "\n", - "\n", - "\n", - "SimulationCell_1Length->cmso.SimulationCellLength\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1_CrystalStructure->54af2219-461b-4fbf-b71d-fcc788131f81\n", + "\n", + "\n", + "cmso.hasAltName\n", "\n", - "\n", - "\n", - "0e12d606-5a2f-42b9-b821-e9f34b3c8e0e\n", - "\n", - "2.87\n", + "\n", + "\n", + "cmso.CrystalStructure\n", + "\n", + "cmso.CrystalStructure\n", "\n", - "\n", - "\n", - "SimulationCell_1Length->0e12d606-5a2f-42b9-b821-e9f34b3c8e0e\n", - "\n", - "\n", - "cmso.hasLength_y\n", + "\n", + "\n", + "sample_1_CrystalStructure->cmso.CrystalStructure\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "7d744f5a-84f8-4829-9906-916bd48c2345\n", - "\n", - "2.87\n", + "\n", + "\n", + "sample_1_UnitCell\n", + "\n", + "sample_1_UnitCell\n", "\n", - "\n", - "\n", - "SimulationCell_1Length->7d744f5a-84f8-4829-9906-916bd48c2345\n", - "\n", - "\n", - "cmso.hasLength_z\n", + "\n", + "\n", + "sample_1_CrystalStructure->sample_1_UnitCell\n", + "\n", + "\n", + "cmso.hasUnitCell\n", + "\n", + "\n", + "\n", + "804fceb6-683b-4279-a4d7-275eadfb2f98\n", + "\n", + "229\n", "\n", - "\n", + "\n", + "\n", + "sample_1_CrystalStructure->804fceb6-683b-4279-a4d7-275eadfb2f98\n", + "\n", + "\n", + "cmso.hasSpaceGroupNumber\n", + "\n", + "\n", "\n", - "SimulationCell_3\n", - "\n", - "SimulationCell_3\n", + "CHEBI.28112\n", + "\n", + "CHEBI.28112\n", "\n", - "\n", + "\n", "\n", - "cmso.SimulationCell\n", - "\n", - "cmso.SimulationCell\n", + "cmso.Element\n", + "\n", + "cmso.Element\n", "\n", - "\n", + "\n", "\n", - "SimulationCell_3->cmso.SimulationCell\n", - "\n", - "\n", - "type\n", + "CHEBI.28112->cmso.Element\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "SimulationCell_3Length\n", - "\n", - "SimulationCell_3Length\n", - "\n", - "\n", - "\n", - "SimulationCell_3->SimulationCell_3Length\n", - "\n", - "\n", - "cmso.hasLength\n", - "\n", - "\n", - "\n", - "SimulationCell_3Vector02\n", - "\n", - "SimulationCell_3Vector02\n", + "\n", + "\n", + "7541e865-0d26-4008-92cc-799ccacd1b9a\n", + "\n", + "0.75\n", "\n", - "\n", - "\n", - "SimulationCell_3->SimulationCell_3Vector02\n", - "\n", - "\n", - "cmso.hasVector\n", + "\n", + "\n", + "CHEBI.28112->7541e865-0d26-4008-92cc-799ccacd1b9a\n", + "\n", + "\n", + "cmso.hasElementRatio\n", "\n", - "\n", - "\n", - "SimulationCell_3Vector03\n", - "\n", - "SimulationCell_3Vector03\n", - "\n", - "\n", - "\n", - "SimulationCell_3->SimulationCell_3Vector03\n", - "\n", - "\n", - "cmso.hasVector\n", - "\n", - "\n", - "\n", - "1944730c-04fe-4df8-914a-92adc093f5f0\n", - "\n", - "1228.48\n", + "\n", + "\n", + "a2f17e37-fd38-48d4-89a1-eed7c9223e8e\n", + "\n", + "Ni\n", "\n", - "\n", - "\n", - "SimulationCell_3->1944730c-04fe-4df8-914a-92adc093f5f0\n", - "\n", - "\n", - "cmso.hasVolume\n", + "\n", + "\n", + "CHEBI.28112->a2f17e37-fd38-48d4-89a1-eed7c9223e8e\n", + "\n", + "\n", + "cmso.hasSymbol\n", "\n", - "\n", - "\n", - "SimulationCell_3Vector01\n", - "\n", - "SimulationCell_3Vector01\n", - "\n", - "\n", - "\n", - "SimulationCell_3->SimulationCell_3Vector01\n", - "\n", - "\n", - "cmso.hasVector\n", - "\n", - "\n", - "\n", - "SimulationCell_3Angle\n", - "\n", - "SimulationCell_3Angle\n", - "\n", - "\n", - "\n", - "SimulationCell_3->SimulationCell_3Angle\n", - "\n", - "\n", - "cmso.hasAngle\n", - "\n", - "\n", + "\n", "\n", - "UnitCell_1LatticeAngle\n", - "\n", - "UnitCell_1LatticeAngle\n", + "sample_2_SimulationCellAngle\n", + "\n", + "sample_2_SimulationCellAngle\n", "\n", - "\n", + "\n", "\n", - "cmso.LatticeAngle\n", - "\n", - "cmso.LatticeAngle\n", + "20ed70e1-e1e2-4854-9773-36aa867d7afb\n", + "\n", + "90.0\n", "\n", - "\n", + "\n", "\n", - "UnitCell_1LatticeAngle->cmso.LatticeAngle\n", - "\n", - "\n", - "type\n", + "sample_2_SimulationCellAngle->20ed70e1-e1e2-4854-9773-36aa867d7afb\n", + "\n", + "\n", + "cmso.hasAngle_gamma\n", "\n", - "\n", - "\n", - "71fc83a0-ea60-482f-b355-f10587cb40eb\n", - "\n", - "90\n", + "\n", + "\n", + "cmso.SimulationCellAngle\n", + "\n", + "cmso.SimulationCellAngle\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeAngle->71fc83a0-ea60-482f-b355-f10587cb40eb\n", - "\n", - "\n", - "cmso.hasAngle_alpha\n", + "\n", + "\n", + "sample_2_SimulationCellAngle->cmso.SimulationCellAngle\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "873c043d-7afd-40f5-b4a2-e42b25b58e33\n", - "\n", - "90\n", + "\n", + "\n", + "c4cecc62-1398-40be-adb9-b34da2073274\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeAngle->873c043d-7afd-40f5-b4a2-e42b25b58e33\n", - "\n", - "\n", - "cmso.hasAngle_gamma\n", - "\n", - "\n", - "\n", - "13a36e66-8b53-40de-a203-e1525ce50221\n", - "\n", - "90\n", - "\n", - "\n", - "\n", - "UnitCell_1LatticeAngle->13a36e66-8b53-40de-a203-e1525ce50221\n", - "\n", - "\n", - "cmso.hasAngle_beta\n", + "\n", + "\n", + "sample_2_SimulationCellAngle->c4cecc62-1398-40be-adb9-b34da2073274\n", + "\n", + "\n", + "cmso.hasAngle_beta\n", "\n", - "\n", - "\n", - "cmso.Angle\n", - "\n", - "cmso.Angle\n", + "\n", + "\n", + "64bc45db-f532-4deb-a2d7-af8ff216e585\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "cmso.LatticeAngle->cmso.Angle\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "sample_2_SimulationCellAngle->64bc45db-f532-4deb-a2d7-af8ff216e585\n", + "\n", + "\n", + "cmso.hasAngle_alpha\n", "\n", - "\n", + "\n", "\n", - "Atom_2_2\n", - "\n", - "Atom_2_2\n", + "sample_2_CrystalStructure\n", + "\n", + "sample_2_CrystalStructure\n", "\n", - "\n", + "\n", "\n", - "Atom_2_2_Element\n", - "\n", - "Atom_2_2_Element\n", + "d7cde4e6-63cc-4426-bac3-1daeb37fbd4f\n", + "\n", + "Diamond\n", "\n", - "\n", + "\n", "\n", - "Atom_2_2->Atom_2_2_Element\n", - "\n", - "\n", - "cmso.hasElement\n", + "sample_2_CrystalStructure->d7cde4e6-63cc-4426-bac3-1daeb37fbd4f\n", + "\n", + "\n", + "cmso.hasAltName\n", "\n", - "\n", - "\n", - "cmso.Atom\n", - "\n", - "cmso.Atom\n", + "\n", + "\n", + "sample_2_CrystalStructure->cmso.CrystalStructure\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_2_2->cmso.Atom\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_2_UnitCell\n", + "\n", + "sample_2_UnitCell\n", "\n", - "\n", - "\n", - "a1c1a427-d444-48e3-846b-bf48281aacaf\n", - "\n", - "4\n", + "\n", + "\n", + "sample_2_CrystalStructure->sample_2_UnitCell\n", + "\n", + "\n", + "cmso.hasUnitCell\n", "\n", - "\n", - "\n", - "Atom_2_2->a1c1a427-d444-48e3-846b-bf48281aacaf\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", + "\n", + "\n", + "9cf31b97-221f-4f16-9934-951116c93f2b\n", + "\n", + "227\n", "\n", - "\n", - "\n", - "Atom_2_2_Position\n", - "\n", - "Atom_2_2_Position\n", + "\n", + "\n", + "sample_2_CrystalStructure->9cf31b97-221f-4f16-9934-951116c93f2b\n", + "\n", + "\n", + "cmso.hasSpaceGroupNumber\n", "\n", - "\n", - "\n", - "Atom_2_2->Atom_2_2_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", + "\n", + "\n", + "4b3fce3e-f4f2-47cd-baa3-860d17561044\n", + "\n", + "Fd-3M\n", "\n", - "\n", - "\n", - "cmso.Element\n", - "\n", - "cmso.Element\n", + "\n", + "\n", + "sample_2_CrystalStructure->4b3fce3e-f4f2-47cd-baa3-860d17561044\n", + "\n", + "\n", + "cmso.hasSpaceGroupSymbol\n", "\n", - "\n", - "\n", - "Atom_2_2_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "ace7dd1f-a2a7-4ef6-b4a2-0ee402e6727f\n", - "\n", - "Si\n", - "\n", - "\n", - "\n", - "Atom_2_2_Element->ace7dd1f-a2a7-4ef6-b4a2-0ee402e6727f\n", - "\n", - "\n", - "cmso.hasSymbol\n", - "\n", - "\n", + "\n", "\n", - "UnitCell_1\n", - "\n", - "UnitCell_1\n", - "\n", - "\n", - "\n", - "UnitCell_1->UnitCell_1LatticeAngle\n", - "\n", - "\n", - "cmso.hasAngle\n", - "\n", - "\n", + "sample_1_LatticeParameter\n", + "\n", + "sample_1_LatticeParameter\n", + "\n", + "\n", "\n", - "UnitCell_1LatticeParameter\n", - "\n", - "UnitCell_1LatticeParameter\n", + "acb3cd96-5316-478e-8d36-efd3c3b9e787\n", + "\n", + "2.87\n", "\n", - "\n", + "\n", "\n", - "UnitCell_1->UnitCell_1LatticeParameter\n", - "\n", - "\n", - "cmso.hasLatticeParamter\n", - "\n", - "\n", - "\n", - "wiki.Q851536\n", - "\n", - "wiki.Q851536\n", - "\n", - "\n", - "\n", - "UnitCell_1->wiki.Q851536\n", - "\n", - "\n", - "cmso.hasBravaisLattice\n", - "\n", - "\n", - "\n", - "cmso.UnitCell\n", - "\n", - "cmso.UnitCell\n", - "\n", - "\n", - "\n", - "UnitCell_1->cmso.UnitCell\n", - "\n", - "\n", - "type\n", + "sample_1_LatticeParameter->acb3cd96-5316-478e-8d36-efd3c3b9e787\n", + "\n", + "\n", + "cmso.hasLength_x\n", "\n", "\n", - "\n", + "\n", "cmso.LatticeParameter\n", - "\n", - "cmso.LatticeParameter\n", + "\n", + "cmso.LatticeParameter\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeParameter->cmso.LatticeParameter\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1_LatticeParameter->cmso.LatticeParameter\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "e2a1d0a7-f1e7-4a01-8ea7-1097d3a0dd9a\n", - "\n", - "2.87\n", + "\n", + "\n", + "1c5b33a3-be30-4206-ae1e-aa0fb141199f\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeParameter->e2a1d0a7-f1e7-4a01-8ea7-1097d3a0dd9a\n", - "\n", - "\n", - "cmso.hasLength_z\n", + "\n", + "\n", + "sample_1_LatticeParameter->1c5b33a3-be30-4206-ae1e-aa0fb141199f\n", + "\n", + "\n", + "cmso.hasLength_z\n", "\n", - "\n", - "\n", - "23bda42e-8eee-4919-a473-df2af35046b5\n", - "\n", - "2.87\n", + "\n", + "\n", + "37720a49-5652-4200-a29e-be1e0e2a0708\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "UnitCell_1LatticeParameter->23bda42e-8eee-4919-a473-df2af35046b5\n", - "\n", - "\n", - "cmso.hasLength_y\n", - "\n", - "\n", - "\n", - "a761e479-cd62-44d3-8c96-fdbe9922527b\n", - "\n", - "2.87\n", - "\n", - "\n", - "\n", - "UnitCell_1LatticeParameter->a761e479-cd62-44d3-8c96-fdbe9922527b\n", - "\n", - "\n", - "cmso.hasLength_x\n", + "\n", + "\n", + "sample_1_LatticeParameter->37720a49-5652-4200-a29e-be1e0e2a0708\n", + "\n", + "\n", + "cmso.hasLength_y\n", "\n", - "\n", + "\n", "\n", - "SimulationCell_1Angle\n", - "\n", - "SimulationCell_1Angle\n", + "sample_3_UnitCell\n", + "\n", + "sample_3_UnitCell\n", "\n", - "\n", + "\n", "\n", - "cmso.SimulationCellAngle\n", - "\n", - "cmso.SimulationCellAngle\n", + "cmso.UnitCell\n", + "\n", + "cmso.UnitCell\n", "\n", - "\n", + "\n", "\n", - "SimulationCell_1Angle->cmso.SimulationCellAngle\n", - "\n", - "\n", - "type\n", + "sample_3_UnitCell->cmso.UnitCell\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "25bee651-7955-4a5e-aec1-2d031b6bba01\n", - "\n", - "90.0\n", + "\n", + "\n", + "sample_3_LatticeAngle\n", + "\n", + "sample_3_LatticeAngle\n", "\n", - "\n", - "\n", - "SimulationCell_1Angle->25bee651-7955-4a5e-aec1-2d031b6bba01\n", - "\n", - "\n", - "cmso.hasAngle_beta\n", + "\n", + "\n", + "sample_3_UnitCell->sample_3_LatticeAngle\n", + "\n", + "\n", + "cmso.hasAngle\n", "\n", - "\n", - "\n", - "4ea1020a-0b0a-4967-b8d4-322e1afa9614\n", - "\n", - "90.0\n", + "\n", + "\n", + "sample_3_LatticeParameter\n", + "\n", + "sample_3_LatticeParameter\n", "\n", - "\n", - "\n", - "SimulationCell_1Angle->4ea1020a-0b0a-4967-b8d4-322e1afa9614\n", - "\n", - "\n", - "cmso.hasAngle_alpha\n", - "\n", - "\n", - "\n", - "b2d9b5d4-3217-419e-bf2a-2fac09b6814e\n", - "\n", - "90.0\n", - "\n", - "\n", - "\n", - "SimulationCell_1Angle->b2d9b5d4-3217-419e-bf2a-2fac09b6814e\n", - "\n", - "\n", - "cmso.hasAngle_gamma\n", + "\n", + "\n", + "sample_3_UnitCell->sample_3_LatticeParameter\n", + "\n", + "\n", + "cmso.hasLatticeParamter\n", "\n", - "\n", - "\n", - "cmso.SimulationCellAngle->cmso.Angle\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "wiki.Q3006714\n", + "\n", + "wiki.Q3006714\n", + "\n", + "\n", + "\n", + "sample_3_UnitCell->wiki.Q3006714\n", + "\n", + "\n", + "cmso.hasBravaisLattice\n", "\n", - "\n", + "\n", "\n", - "Atom_2_7_Position\n", - "\n", - "Atom_2_7_Position\n", + "sample_2_SimulationCellVector_3\n", + "\n", + "sample_2_SimulationCellVector_3\n", "\n", - "\n", + "\n", "\n", - "cmso.PositionVector\n", - "\n", - "cmso.PositionVector\n", + "cmso.SimulationCellVector\n", + "\n", + "cmso.SimulationCellVector\n", "\n", - "\n", + "\n", "\n", - "Atom_2_7_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "sample_2_SimulationCellVector_3->cmso.SimulationCellVector\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "076ac7ec-ba50-4609-be9a-5d28b456dd5c\n", - "\n", - "1.3575\n", + "\n", + "\n", + "19d45b72-a4cf-42c8-bc42-61b20a638895\n", + "\n", + "5.43\n", "\n", - "\n", - "\n", - "Atom_2_7_Position->076ac7ec-ba50-4609-be9a-5d28b456dd5c\n", - "\n", - "\n", - "cmso.hasComponent_x\n", - "\n", - "\n", - "\n", - "193b3d81-27e0-425e-98ad-37962f2a9acc\n", - "\n", - "4.0725\n", - "\n", - "\n", - "\n", - "Atom_2_7_Position->193b3d81-27e0-425e-98ad-37962f2a9acc\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "a1b22bb6-4786-48a9-91b8-ac48f08ec948\n", - "\n", - "4.0725\n", - "\n", - "\n", - "\n", - "Atom_2_7_Position->a1b22bb6-4786-48a9-91b8-ac48f08ec948\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "sample_2_SimulationCellVector_3->19d45b72-a4cf-42c8-bc42-61b20a638895\n", + "\n", + "\n", + "cmso.hasComponent_z\n", + "\n", + "\n", + "\n", + "6e999457-c4bb-489e-a2e0-34ee2dd528da\n", + "\n", + "0.0\n", + "\n", + "\n", + "\n", + "sample_2_SimulationCellVector_3->6e999457-c4bb-489e-a2e0-34ee2dd528da\n", + "\n", + "\n", + "cmso.hasComponent_y\n", + "\n", + "\n", + "\n", + "aaca8987-25eb-44c7-8fad-544c5e83ca62\n", + "\n", + "0.0\n", + "\n", + "\n", + "\n", + "sample_2_SimulationCellVector_3->aaca8987-25eb-44c7-8fad-544c5e83ca62\n", + "\n", + "\n", + "cmso.hasComponent_x\n", "\n", "\n", - "\n", + "\n", "cmso.Vector\n", - "\n", - "cmso.Vector\n", + "\n", + "cmso.Vector\n", "\n", - "\n", - "\n", - "cmso.PositionVector->cmso.Vector\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "cmso.SimulationCellVector->cmso.Vector\n", + "\n", + "\n", + "subClassOf\n", "\n", - "\n", + "\n", + "\n", + "sample_2_SimulationCellLength\n", + "\n", + "sample_2_SimulationCellLength\n", + "\n", + "\n", "\n", - "6e8139f4-1028-46d2-9b07-0da0fe01e830\n", - "\n", - "3.57\n", + "53218f22-6825-423f-a0fc-e26e57ec7ebf\n", + "\n", + "5.43\n", "\n", - "\n", + "\n", "\n", - "SimulationCell_3Length->6e8139f4-1028-46d2-9b07-0da0fe01e830\n", - "\n", - "\n", - "cmso.hasLength_y\n", - "\n", - "\n", - "\n", - "SimulationCell_3Length->cmso.SimulationCellLength\n", - "\n", - "\n", - "type\n", + "sample_2_SimulationCellLength->53218f22-6825-423f-a0fc-e26e57ec7ebf\n", + "\n", + "\n", + "cmso.hasLength_y\n", "\n", - "\n", - "\n", - "cd88fc76-d160-42eb-b34a-c26b3e9c14b9\n", - "\n", - "3.57\n", + "\n", + "\n", + "cmso.SimulationCellLength\n", + "\n", + "cmso.SimulationCellLength\n", "\n", - "\n", - "\n", - "SimulationCell_3Length->cd88fc76-d160-42eb-b34a-c26b3e9c14b9\n", - "\n", - "\n", - "cmso.hasLength_z\n", - "\n", - "\n", - "\n", - "e2ab9ec4-52a4-446f-acc0-076c15b6f736\n", - "\n", - "3.57\n", - "\n", - "\n", - "\n", - "SimulationCell_3Length->e2ab9ec4-52a4-446f-acc0-076c15b6f736\n", - "\n", - "\n", - "cmso.hasLength_x\n", - "\n", - "\n", - "\n", - "Atom_3_1\n", - "\n", - "Atom_3_1\n", + "\n", + "\n", + "sample_2_SimulationCellLength->cmso.SimulationCellLength\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "33b78883-de53-484d-aa92-19fab76ebf97\n", - "\n", - "12\n", + "\n", + "\n", + "2ad3178e-f7cc-460e-8774-1c358da5a709\n", + "\n", + "5.43\n", "\n", - "\n", - "\n", - "Atom_3_1->33b78883-de53-484d-aa92-19fab76ebf97\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", - "\n", - "\n", - "\n", - "Atom_3_1->cmso.Atom\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "Atom_3_1_Element\n", - "\n", - "Atom_3_1_Element\n", + "\n", + "\n", + "sample_2_SimulationCellLength->2ad3178e-f7cc-460e-8774-1c358da5a709\n", + "\n", + "\n", + "cmso.hasLength_x\n", "\n", - "\n", - "\n", - "Atom_3_1->Atom_3_1_Element\n", - "\n", - "\n", - "cmso.hasElement\n", + "\n", + "\n", + "5f26ffba-6dfa-444a-8d50-bc3ad7c4cc04\n", + "\n", + "5.43\n", "\n", - "\n", - "\n", - "Atom_3_1_Position\n", - "\n", - "Atom_3_1_Position\n", + "\n", + "\n", + "sample_2_SimulationCellLength->5f26ffba-6dfa-444a-8d50-bc3ad7c4cc04\n", + "\n", + "\n", + "cmso.hasLength_z\n", "\n", - "\n", - "\n", - "Atom_3_1->Atom_3_1_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", + "\n", + "\n", + "sample_3_SimulationCellAngle\n", + "\n", + "sample_3_SimulationCellAngle\n", "\n", - "\n", + "\n", "\n", - "Atom_2_4\n", - "\n", - "Atom_2_4\n", - "\n", - "\n", - "\n", - "Atom_2_4_Element\n", - "\n", - "Atom_2_4_Element\n", + "6cfb5789-ffaa-4872-9328-35f947468fb6\n", + "\n", + "90.0\n", "\n", - "\n", + "\n", "\n", - "Atom_2_4->Atom_2_4_Element\n", - "\n", - "\n", - "cmso.hasElement\n", + "sample_3_SimulationCellAngle->6cfb5789-ffaa-4872-9328-35f947468fb6\n", + "\n", + "\n", + "cmso.hasAngle_gamma\n", "\n", - "\n", - "\n", - "Atom_2_4->cmso.Atom\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_3_SimulationCellAngle->cmso.SimulationCellAngle\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_2_4_Position\n", - "\n", - "Atom_2_4_Position\n", + "\n", + "\n", + "05c40b99-db4a-4c9e-b398-3020428dc564\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "Atom_2_4->Atom_2_4_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", - "\n", - "\n", - "\n", - "43b766d2-3403-4148-a535-318f16b7be0f\n", - "\n", - "4\n", - "\n", - "\n", - "\n", - "Atom_2_4->43b766d2-3403-4148-a535-318f16b7be0f\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", - "\n", - "\n", - "\n", - "Atom_2_4_Element->cmso.Element\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_3_SimulationCellAngle->05c40b99-db4a-4c9e-b398-3020428dc564\n", + "\n", + "\n", + "cmso.hasAngle_beta\n", "\n", - "\n", - "\n", - "28644d50-1318-43ba-ba0c-01a16214fee4\n", - "\n", - "Si\n", + "\n", + "\n", + "c50ca7b3-e2f0-4d7c-9850-183d3c344c79\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "Atom_2_4_Element->28644d50-1318-43ba-ba0c-01a16214fee4\n", - "\n", - "\n", - "cmso.hasSymbol\n", + "\n", + "\n", + "sample_3_SimulationCellAngle->c50ca7b3-e2f0-4d7c-9850-183d3c344c79\n", + "\n", + "\n", + "cmso.hasAngle_alpha\n", "\n", - "\n", + "\n", "\n", - "SimulationCell_2Vector03\n", - "\n", - "SimulationCell_2Vector03\n", + "sample_3_CrystalStructure\n", + "\n", + "sample_3_CrystalStructure\n", "\n", - "\n", - "\n", - "fa45b725-c6ba-4768-beb8-9b04079c3b7f\n", - "\n", - "5.43\n", + "\n", + "\n", + "sample_3_CrystalStructure->sample_3_UnitCell\n", + "\n", + "\n", + "cmso.hasUnitCell\n", "\n", - "\n", - "\n", - "SimulationCell_2Vector03->fa45b725-c6ba-4768-beb8-9b04079c3b7f\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "\n", + "\n", + "sample_3_CrystalStructure->cmso.CrystalStructure\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "cmso.SimulationCellVector\n", - "\n", - "cmso.SimulationCellVector\n", + "\n", + "\n", + "ccffa5be-bd0d-40ef-8d5f-4ec1fdc630b7\n", + "\n", + "Pm-3M\n", "\n", - "\n", - "\n", - "SimulationCell_2Vector03->cmso.SimulationCellVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_3_CrystalStructure->ccffa5be-bd0d-40ef-8d5f-4ec1fdc630b7\n", + "\n", + "\n", + "cmso.hasSpaceGroupSymbol\n", "\n", - "\n", - "\n", - "cb190bb5-65e0-4cfc-b625-7098bebc5d0d\n", - "\n", - "0.0\n", + "\n", + "\n", + "8f7b95bd-8893-4075-bbe1-18b004f68af4\n", + "\n", + "L12\n", "\n", - "\n", - "\n", - "SimulationCell_2Vector03->cb190bb5-65e0-4cfc-b625-7098bebc5d0d\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "9b86ff38-e543-46dd-bd16-520b38af0ac9\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "SimulationCell_2Vector03->9b86ff38-e543-46dd-bd16-520b38af0ac9\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "sample_3_CrystalStructure->8f7b95bd-8893-4075-bbe1-18b004f68af4\n", + "\n", + "\n", + "cmso.hasAltName\n", "\n", - "\n", - "\n", - "cmso.LatticeVector\n", - "\n", - "cmso.LatticeVector\n", + "\n", + "\n", + "927b2521-6603-4909-8f92-7959226992f5\n", + "\n", + "221\n", "\n", - "\n", - "\n", - "cmso.LatticeVector->cmso.Vector\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "sample_3_CrystalStructure->927b2521-6603-4909-8f92-7959226992f5\n", + "\n", + "\n", + "cmso.hasSpaceGroupNumber\n", "\n", - "\n", - "\n", - "ANGSTROM\n", - "\n", - "ANGSTROM\n", + "\n", + "\n", + "sample_1_SimulationCellVector_3\n", + "\n", + "sample_1_SimulationCellVector_3\n", "\n", - "\n", - "\n", - "cmso.Vector->ANGSTROM\n", - "\n", - "\n", - "cmso.hasUnit\n", + "\n", + "\n", + "sample_1_SimulationCellVector_3->cmso.SimulationCellVector\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_2_6_Position\n", - "\n", - "Atom_2_6_Position\n", + "\n", + "\n", + "d90df73d-7c7a-4d76-a0c9-fc791f9e7d38\n", + "\n", + "0.0\n", "\n", - "\n", + "\n", "\n", - "Atom_2_6_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "sample_1_SimulationCellVector_3->d90df73d-7c7a-4d76-a0c9-fc791f9e7d38\n", + "\n", + "\n", + "cmso.hasComponent_x\n", "\n", - "\n", - "\n", - "67ae8664-2768-478b-9a9c-c30862493e28\n", - "\n", - "1.3575\n", + "\n", + "\n", + "eb3d19f2-955a-495f-9cfe-fbcc4cbc9742\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "Atom_2_6_Position->67ae8664-2768-478b-9a9c-c30862493e28\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "dd6fec4e-ba2f-49dd-89a5-bab9729592db\n", - "\n", - "4.0725\n", - "\n", - "\n", - "\n", - "Atom_2_6_Position->dd6fec4e-ba2f-49dd-89a5-bab9729592db\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "46c3a49d-fef2-4a13-b7c6-6b78719d7c12\n", - "\n", - "4.0725\n", - "\n", - "\n", - "\n", - "Atom_2_6_Position->46c3a49d-fef2-4a13-b7c6-6b78719d7c12\n", - "\n", - "\n", - "cmso.hasComponent_x\n", - "\n", - "\n", - "\n", - "CrystalStructure_3\n", - "\n", - "CrystalStructure_3\n", + "\n", + "\n", + "sample_1_SimulationCellVector_3->eb3d19f2-955a-495f-9cfe-fbcc4cbc9742\n", + "\n", + "\n", + "cmso.hasComponent_z\n", "\n", - "\n", - "\n", - "UnitCell_3\n", - "\n", - "UnitCell_3\n", + "\n", + "\n", + "cf8efc6c-f950-4656-979f-3c7129364d51\n", + "\n", + "0.0\n", + "\n", + "\n", + "\n", + "sample_1_SimulationCellVector_3->cf8efc6c-f950-4656-979f-3c7129364d51\n", + "\n", + "\n", + "cmso.hasComponent_y\n", + "\n", + "\n", + "\n", + "sample_1_SimulationCellAngle\n", + "\n", + "sample_1_SimulationCellAngle\n", "\n", - "\n", + "\n", "\n", - "CrystalStructure_3->UnitCell_3\n", - "\n", - "\n", - "cmso.hasUnitCell\n", + "sample_1_SimulationCellAngle->cmso.SimulationCellAngle\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "cmso.CrystalStructure\n", - "\n", - "cmso.CrystalStructure\n", + "\n", + "\n", + "21ca695c-4254-4f24-985f-1524c9dc8db5\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "CrystalStructure_3->cmso.CrystalStructure\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "98641ba9-ae9f-437f-9479-4da4777248f6\n", - "\n", - "Pm-3M\n", - "\n", - "\n", - "\n", - "CrystalStructure_3->98641ba9-ae9f-437f-9479-4da4777248f6\n", - "\n", - "\n", - "cmso.hasSpaceGroupSymbol\n", - "\n", - "\n", - "\n", - "4bdf303e-07c9-441d-b4eb-688e6cacdafd\n", - "\n", - "L12\n", - "\n", - "\n", - "\n", - "CrystalStructure_3->4bdf303e-07c9-441d-b4eb-688e6cacdafd\n", - "\n", - "\n", - "cmso.hasAltName\n", - "\n", - "\n", - "\n", - "b0a7f1ba-37d3-4329-a031-03451661ae91\n", - "\n", - "221\n", - "\n", - "\n", - "\n", - "CrystalStructure_3->b0a7f1ba-37d3-4329-a031-03451661ae91\n", - "\n", - "\n", - "cmso.hasSpaceGroupNumber\n", - "\n", - "\n", - "\n", - "UnitCell_3LatticeAngle\n", - "\n", - "UnitCell_3LatticeAngle\n", + "\n", + "\n", + "sample_1_SimulationCellAngle->21ca695c-4254-4f24-985f-1524c9dc8db5\n", + "\n", + "\n", + "cmso.hasAngle_alpha\n", "\n", - "\n", - "\n", - "UnitCell_3->UnitCell_3LatticeAngle\n", - "\n", - "\n", - "cmso.hasAngle\n", + "\n", + "\n", + "7c401959-b814-4ac4-b4ca-42fe6f439a95\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "UnitCell_3LatticeParameter\n", - "\n", - "UnitCell_3LatticeParameter\n", + "\n", + "\n", + "sample_1_SimulationCellAngle->7c401959-b814-4ac4-b4ca-42fe6f439a95\n", + "\n", + "\n", + "cmso.hasAngle_gamma\n", "\n", - "\n", - "\n", - "UnitCell_3->UnitCell_3LatticeParameter\n", - "\n", - "\n", - "cmso.hasLatticeParamter\n", + "\n", + "\n", + "73258895-a388-4844-be2d-f482d8437e54\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "UnitCell_3->cmso.UnitCell\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1_SimulationCellAngle->73258895-a388-4844-be2d-f482d8437e54\n", + "\n", + "\n", + "cmso.hasAngle_beta\n", "\n", - "\n", - "\n", - "wiki.Q3006714\n", - "\n", - "wiki.Q3006714\n", + "\n", + "\n", + "cmso.Angle\n", + "\n", + "cmso.Angle\n", "\n", - "\n", - "\n", - "UnitCell_3->wiki.Q3006714\n", - "\n", - "\n", - "cmso.hasBravaisLattice\n", + "\n", + "\n", + "cmso.SimulationCellAngle->cmso.Angle\n", + "\n", + "\n", + "subClassOf\n", "\n", - "\n", - "\n", - "SimulationCell_2Length\n", - "\n", - "SimulationCell_2Length\n", + "\n", + "\n", + "sample_2_SimulationCellVector_1\n", + "\n", + "sample_2_SimulationCellVector_1\n", "\n", - "\n", - "\n", - "cd487803-ee93-44e3-a5bf-3df283a27da7\n", - "\n", - "5.43\n", + "\n", + "\n", + "sample_2_SimulationCellVector_1->cmso.SimulationCellVector\n", + "\n", + "\n", + "type\n", + "\n", + "\n", + "\n", + "03b5ec70-b15c-4cb2-b998-62c350e61580\n", + "\n", + "0.0\n", "\n", - "\n", + "\n", "\n", - "SimulationCell_2Length->cd487803-ee93-44e3-a5bf-3df283a27da7\n", - "\n", - "\n", - "cmso.hasLength_z\n", + "sample_2_SimulationCellVector_1->03b5ec70-b15c-4cb2-b998-62c350e61580\n", + "\n", + "\n", + "cmso.hasComponent_z\n", "\n", - "\n", - "\n", - "SimulationCell_2Length->cmso.SimulationCellLength\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "f609c7cc-b4ae-450b-8b78-241e9ce5be66\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "f42a404f-595d-433a-8427-8d9236b80568\n", - "\n", - "5.43\n", + "\n", + "\n", + "sample_2_SimulationCellVector_1->f609c7cc-b4ae-450b-8b78-241e9ce5be66\n", + "\n", + "\n", + "cmso.hasComponent_y\n", "\n", - "\n", - "\n", - "SimulationCell_2Length->f42a404f-595d-433a-8427-8d9236b80568\n", - "\n", - "\n", - "cmso.hasLength_x\n", - "\n", - "\n", - "\n", - "4d224421-c601-4e89-8b61-659fcb16a950\n", - "\n", - "5.43\n", - "\n", - "\n", - "\n", - "SimulationCell_2Length->4d224421-c601-4e89-8b61-659fcb16a950\n", - "\n", - "\n", - "cmso.hasLength_y\n", - "\n", - "\n", - "\n", - "Material_1\n", - "\n", - "Material_1\n", + "\n", + "\n", + "17e5655e-23cb-43aa-ba77-e08bef6441dc\n", + "\n", + "5.43\n", "\n", - "\n", - "\n", - "cmso.CrystallineMaterial\n", - "\n", - "cmso.CrystallineMaterial\n", + "\n", + "\n", + "sample_2_SimulationCellVector_1->17e5655e-23cb-43aa-ba77-e08bef6441dc\n", + "\n", + "\n", + "cmso.hasComponent_x\n", "\n", - "\n", - "\n", - "Material_1->cmso.CrystallineMaterial\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_3_SimulationCell\n", + "\n", + "sample_3_SimulationCell\n", "\n", - "\n", - "\n", - "CrystalStructure_1\n", - "\n", - "CrystalStructure_1\n", + "\n", + "\n", + "sample_3_SimulationCell->sample_3_SimulationCellAngle\n", + "\n", + "\n", + "cmso.hasAngle\n", "\n", - "\n", - "\n", - "Material_1->CrystalStructure_1\n", - "\n", - "\n", - "cmso.hasStructure\n", - "\n", - "\n", - "\n", - "b617e261-4fc5-4e2d-9a96-8c43791588e8\n", - "\n", - "Fe=1.0\n", - "\n", - "\n", - "\n", - "Material_1->b617e261-4fc5-4e2d-9a96-8c43791588e8\n", - "\n", - "\n", - "cmso.hasElementRatio\n", - "\n", - "\n", - "\n", - "Atom_1_1\n", - "\n", - "Atom_1_1\n", + "\n", + "\n", + "sample_3_SimulationCellVector_2\n", + "\n", + "sample_3_SimulationCellVector_2\n", + "\n", + "\n", + "\n", + "sample_3_SimulationCell->sample_3_SimulationCellVector_2\n", + "\n", + "\n", + "cmso.hasVector\n", "\n", - "\n", + "\n", "\n", - "Atom_1_1_Position\n", - "\n", - "Atom_1_1_Position\n", + "sample_3_SimulationCellVector_1\n", + "\n", + "sample_3_SimulationCellVector_1\n", "\n", - "\n", - "\n", - "Atom_1_1->Atom_1_1_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", + "\n", + "\n", + "sample_3_SimulationCell->sample_3_SimulationCellVector_1\n", + "\n", + "\n", + "cmso.hasVector\n", "\n", - "\n", - "\n", - "Atom_1_1->cmso.Atom\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_3_SimulationCellLength\n", + "\n", + "sample_3_SimulationCellLength\n", "\n", - "\n", - "\n", - "Atom_1_1_Element\n", - "\n", - "Atom_1_1_Element\n", - "\n", - "\n", - "\n", - "Atom_1_1->Atom_1_1_Element\n", - "\n", - "\n", - "cmso.hasElement\n", - "\n", - "\n", - "\n", - "b932395a-0fe4-411d-a00b-841853001ed5\n", - "\n", - "14\n", - "\n", - "\n", - "\n", - "Atom_1_1->b932395a-0fe4-411d-a00b-841853001ed5\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", - "\n", - "\n", - "\n", - "Atom_1_1_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_3_SimulationCell->sample_3_SimulationCellLength\n", + "\n", + "\n", + "cmso.hasLength\n", "\n", - "\n", - "\n", - "ad9a3be3-ee84-420c-9e40-11d337117861\n", - "\n", - "1.435\n", + "\n", + "\n", + "sample_3_SimulationCellVector_3\n", + "\n", + "sample_3_SimulationCellVector_3\n", "\n", - "\n", - "\n", - "Atom_1_1_Position->ad9a3be3-ee84-420c-9e40-11d337117861\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "sample_3_SimulationCell->sample_3_SimulationCellVector_3\n", + "\n", + "\n", + "cmso.hasVector\n", "\n", - "\n", - "\n", - "85a3588e-9ce2-43ab-b181-fd9badb86512\n", - "\n", - "1.435\n", + "\n", + "\n", + "cmso.SimulationCell\n", + "\n", + "cmso.SimulationCell\n", "\n", - "\n", - "\n", - "Atom_1_1_Position->85a3588e-9ce2-43ab-b181-fd9badb86512\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "sample_3_SimulationCell->cmso.SimulationCell\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "b984d291-0d47-4a47-ac6f-f96e1e0942a2\n", - "\n", - "1.435\n", + "\n", + "\n", + "a6f84ec8-89af-49ed-9175-9539a6d552a4\n", + "\n", + "1228.48\n", "\n", - "\n", - "\n", - "Atom_1_1_Position->b984d291-0d47-4a47-ac6f-f96e1e0942a2\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "\n", + "\n", + "sample_3_SimulationCell->a6f84ec8-89af-49ed-9175-9539a6d552a4\n", + "\n", + "\n", + "cmso.hasVolume\n", "\n", - "\n", - "\n", - "SimulationCell_3Vector02->cmso.SimulationCellVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_3_SimulationCellVector_2->cmso.SimulationCellVector\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "ee9971ad-856a-423c-ad92-1570466fbffc\n", - "\n", - "0.0\n", + "\n", + "\n", + "e438f418-59d0-4de8-b171-dcc3b36b074d\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "SimulationCell_3Vector02->ee9971ad-856a-423c-ad92-1570466fbffc\n", - "\n", - "\n", - "cmso.hasComponent_x\n", - "\n", - "\n", - "\n", - "f286cb1d-c485-4df9-aede-3a08a81eefbe\n", - "\n", - "3.57\n", - "\n", - "\n", - "\n", - "SimulationCell_3Vector02->f286cb1d-c485-4df9-aede-3a08a81eefbe\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "4d85ba26-4e3e-43d0-a256-16395c4dee25\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "SimulationCell_3Vector02->4d85ba26-4e3e-43d0-a256-16395c4dee25\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "\n", + "\n", + "sample_3_SimulationCellVector_2->e438f418-59d0-4de8-b171-dcc3b36b074d\n", + "\n", + "\n", + "cmso.hasComponent_x\n", "\n", - "\n", - "\n", - "cmso.SimulationCellVector->cmso.Vector\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "9757d5f9-7ae2-4de9-af4c-bcd042ab562a\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector03\n", - "\n", - "SimulationCell_1Vector03\n", - "\n", - "\n", - "\n", - "SimulationCell_1Vector03->cmso.SimulationCellVector\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "ead68797-5f05-4716-a14d-9284d12bb97a\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_3_SimulationCellVector_2->9757d5f9-7ae2-4de9-af4c-bcd042ab562a\n", + "\n", + "\n", + "cmso.hasComponent_z\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector03->ead68797-5f05-4716-a14d-9284d12bb97a\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "6f512432-9827-41df-a223-fb798426e25c\n", + "\n", + "3.57\n", "\n", - "\n", - "\n", - "f5785d2a-47f7-4e00-b441-6c556da24b65\n", - "\n", - "2.87\n", + "\n", + "\n", + "sample_3_SimulationCellVector_2->6f512432-9827-41df-a223-fb798426e25c\n", + "\n", + "\n", + "cmso.hasComponent_y\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector03->f5785d2a-47f7-4e00-b441-6c556da24b65\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "b479bc50-0bc5-49e0-8f3f-944e984dcb89\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "SimulationCell_1Vector03->b479bc50-0bc5-49e0-8f3f-944e984dcb89\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "sample_3\n", + "\n", + "sample_3\n", "\n", - "\n", - "\n", - "Atom_2_1_Position\n", - "\n", - "Atom_2_1_Position\n", + "\n", + "\n", + "sample_3->sample_3_SimulationCell\n", + "\n", + "\n", + "cmso.hasSimulationCell\n", "\n", - "\n", - "\n", - "Atom_2_1_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "cmso.AtomicScaleSample\n", + "\n", + "cmso.AtomicScaleSample\n", "\n", - "\n", - "\n", - "ad6df548-eaef-4f89-b408-3a0bb70a0427\n", - "\n", - "1.3575\n", + "\n", + "\n", + "sample_3->cmso.AtomicScaleSample\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_2_1_Position->ad6df548-eaef-4f89-b408-3a0bb70a0427\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "sample_3_Material\n", + "\n", + "sample_3_Material\n", "\n", - "\n", - "\n", - "9e067027-536f-4b67-828b-df29c7ab6a6f\n", - "\n", - "1.3575\n", + "\n", + "\n", + "sample_3->sample_3_Material\n", + "\n", + "\n", + "cmso.hasMaterial\n", "\n", - "\n", - "\n", - "Atom_2_1_Position->9e067027-536f-4b67-828b-df29c7ab6a6f\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "f7e45817-efbb-4465-bea1-32888ff7791d\n", - "\n", - "1.3575\n", - "\n", - "\n", - "\n", - "Atom_2_1_Position->f7e45817-efbb-4465-bea1-32888ff7791d\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "Atom_2_4_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_3_Species\n", + "\n", + "sample_3_Species\n", "\n", - "\n", - "\n", - "6c860f57-ffb7-4fa7-a173-11366081f969\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_3->sample_3_Species\n", + "\n", + "\n", + "cmso.hasAttribute\n", "\n", - "\n", - "\n", - "Atom_2_4_Position->6c860f57-ffb7-4fa7-a173-11366081f969\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "d6b9deec-582c-4365-a585-80f18a17c3c9\n", - "\n", - "2.715\n", - "\n", - "\n", - "\n", - "Atom_2_4_Position->d6b9deec-582c-4365-a585-80f18a17c3c9\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "4c31e3cc-76f9-42ee-a4ad-fd2c3ad5a308\n", - "\n", - "2.715\n", - "\n", - "\n", - "\n", - "Atom_2_4_Position->4c31e3cc-76f9-42ee-a4ad-fd2c3ad5a308\n", - "\n", - "\n", - "cmso.hasComponent_x\n", - "\n", - "\n", - "\n", - "CrystalStructure_1->UnitCell_1\n", - "\n", - "\n", - "cmso.hasUnitCell\n", - "\n", - "\n", - "\n", - "9a7a9ada-3b9d-4650-bd56-e82f00d8958e\n", - "\n", - "229\n", + "\n", + "\n", + "sample_3_Position\n", + "\n", + "sample_3_Position\n", "\n", - "\n", - "\n", - "CrystalStructure_1->9a7a9ada-3b9d-4650-bd56-e82f00d8958e\n", - "\n", - "\n", - "cmso.hasSpaceGroupNumber\n", + "\n", + "\n", + "sample_3->sample_3_Position\n", + "\n", + "\n", + "cmso.hasAttribute\n", "\n", - "\n", - "\n", - "CrystalStructure_1->cmso.CrystalStructure\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_3_ChemicalSpecies\n", + "\n", + "sample_3_ChemicalSpecies\n", "\n", - "\n", - "\n", - "15c4afc0-f9c7-4a60-8ed6-37c8f5760315\n", - "\n", - "Bcc\n", + "\n", + "\n", + "sample_3->sample_3_ChemicalSpecies\n", + "\n", + "\n", + "cmso.hasSpecies\n", "\n", - "\n", - "\n", - "CrystalStructure_1->15c4afc0-f9c7-4a60-8ed6-37c8f5760315\n", - "\n", - "\n", - "cmso.hasAltName\n", + "\n", + "\n", + "c68ddf9d-4734-4c7c-ab44-587084096e22\n", + "\n", + "4\n", "\n", - "\n", - "\n", - "65e8a31b-69ff-43c3-a39c-34d7aa4edd38\n", - "\n", - "Im-3M\n", + "\n", + "\n", + "sample_3->c68ddf9d-4734-4c7c-ab44-587084096e22\n", + "\n", + "\n", + "cmso.hasNumberOfAtoms\n", "\n", - "\n", - "\n", - "CrystalStructure_1->65e8a31b-69ff-43c3-a39c-34d7aa4edd38\n", - "\n", - "\n", - "cmso.hasSpaceGroupSymbol\n", + "\n", + "\n", + "sample_3_SimulationCellVector_1->cmso.SimulationCellVector\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "SimulationCell_2\n", - "\n", - "SimulationCell_2\n", + "\n", + "\n", + "f624c9e7-a94e-4c91-b3fa-f7e54d1effb2\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "SimulationCell_2->cmso.SimulationCell\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_3_SimulationCellVector_1->f624c9e7-a94e-4c91-b3fa-f7e54d1effb2\n", + "\n", + "\n", + "cmso.hasComponent_y\n", "\n", - "\n", - "\n", - "SimulationCell_2->SimulationCell_2Vector03\n", - "\n", - "\n", - "cmso.hasVector\n", + "\n", + "\n", + "5f5163f5-9e5a-496a-8b5f-86b83503201e\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "SimulationCell_2->SimulationCell_2Length\n", - "\n", - "\n", - "cmso.hasLength\n", + "\n", + "\n", + "sample_3_SimulationCellVector_1->5f5163f5-9e5a-496a-8b5f-86b83503201e\n", + "\n", + "\n", + "cmso.hasComponent_z\n", "\n", - "\n", - "\n", - "SimulationCell_2Vector02\n", - "\n", - "SimulationCell_2Vector02\n", + "\n", + "\n", + "f18870b3-4350-4603-82a0-70220e2b7e24\n", + "\n", + "3.57\n", "\n", - "\n", - "\n", - "SimulationCell_2->SimulationCell_2Vector02\n", - "\n", - "\n", - "cmso.hasVector\n", + "\n", + "\n", + "sample_3_SimulationCellVector_1->f18870b3-4350-4603-82a0-70220e2b7e24\n", + "\n", + "\n", + "cmso.hasComponent_x\n", "\n", - "\n", - "\n", - "SimulationCell_2Angle\n", - "\n", - "SimulationCell_2Angle\n", + "\n", + "\n", + "cmso.Length\n", + "\n", + "cmso.Length\n", "\n", - "\n", - "\n", - "SimulationCell_2->SimulationCell_2Angle\n", - "\n", - "\n", - "cmso.hasAngle\n", + "\n", + "\n", + "cmso.LatticeParameter->cmso.Length\n", + "\n", + "\n", + "subClassOf\n", "\n", - "\n", - "\n", - "SimulationCell_2Vector01\n", - "\n", - "SimulationCell_2Vector01\n", - "\n", - "\n", - "\n", - "SimulationCell_2->SimulationCell_2Vector01\n", - "\n", - "\n", - "cmso.hasVector\n", - "\n", - "\n", - "\n", - "4e2f4fff-5488-457a-b310-afc2de0a97bf\n", - "\n", - "1280.82\n", - "\n", - "\n", - "\n", - "SimulationCell_2->4e2f4fff-5488-457a-b310-afc2de0a97bf\n", - "\n", - "\n", - "cmso.hasVolume\n", - "\n", - "\n", - "\n", - "SimulationCell_2Vector02->cmso.SimulationCellVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_2_LatticeParameter\n", + "\n", + "sample_2_LatticeParameter\n", "\n", - "\n", - "\n", - "c700c213-d488-4e71-9396-42fbf21435df\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_2_LatticeParameter->cmso.LatticeParameter\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "SimulationCell_2Vector02->c700c213-d488-4e71-9396-42fbf21435df\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "\n", + "\n", + "9e8188f6-d8ae-44d2-a056-91ac677a8b4a\n", + "\n", + "5.43\n", "\n", - "\n", - "\n", - "5969a43e-6f80-4f3d-9658-99fc0e1a22e1\n", - "\n", - "5.43\n", + "\n", + "\n", + "sample_2_LatticeParameter->9e8188f6-d8ae-44d2-a056-91ac677a8b4a\n", + "\n", + "\n", + "cmso.hasLength_z\n", "\n", - "\n", - "\n", - "SimulationCell_2Vector02->5969a43e-6f80-4f3d-9658-99fc0e1a22e1\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "5103f9bc-0394-4873-91b9-35cab822cb2f\n", + "\n", + "5.43\n", "\n", - "\n", - "\n", - "b00a9f4c-4b53-4a9b-aff8-43ffcac410b2\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_2_LatticeParameter->5103f9bc-0394-4873-91b9-35cab822cb2f\n", + "\n", + "\n", + "cmso.hasLength_y\n", "\n", - "\n", - "\n", - "SimulationCell_2Vector02->b00a9f4c-4b53-4a9b-aff8-43ffcac410b2\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "ffe79257-4af6-4598-80e2-b244aaceaa6d\n", + "\n", + "5.43\n", "\n", - "\n", - "\n", - "cmso.Length\n", - "\n", - "cmso.Length\n", + "\n", + "\n", + "sample_2_LatticeParameter->ffe79257-4af6-4598-80e2-b244aaceaa6d\n", + "\n", + "\n", + "cmso.hasLength_x\n", "\n", - "\n", - "\n", - "cmso.SimulationCellLength->cmso.Length\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "374b3e69-b077-41e6-8444-70cbbb22179c\n", + "\n", + "3.57\n", "\n", - "\n", - "\n", - "Atom_2_1_Element\n", - "\n", - "Atom_2_1_Element\n", + "\n", + "\n", + "sample_3_SimulationCellLength->374b3e69-b077-41e6-8444-70cbbb22179c\n", + "\n", + "\n", + "cmso.hasLength_x\n", "\n", - "\n", - "\n", - "de0b8e4d-e4ce-49b1-97e9-09d5e817026c\n", - "\n", - "Si\n", + "\n", + "\n", + "sample_3_SimulationCellLength->cmso.SimulationCellLength\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_2_1_Element->de0b8e4d-e4ce-49b1-97e9-09d5e817026c\n", - "\n", - "\n", - "cmso.hasSymbol\n", + "\n", + "\n", + "adf4e0a8-552d-4e34-97fa-39e7702bd65f\n", + "\n", + "3.57\n", "\n", - "\n", - "\n", - "Atom_2_1_Element->cmso.Element\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_3_SimulationCellLength->adf4e0a8-552d-4e34-97fa-39e7702bd65f\n", + "\n", + "\n", + "cmso.hasLength_z\n", "\n", - "\n", - "\n", - "SimulationCell_2Angle->cmso.SimulationCellAngle\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "9afd8477-0e09-4808-8eeb-b6a19d0d1bfd\n", + "\n", + "3.57\n", "\n", - "\n", - "\n", - "74ab88c6-210f-4316-91b9-10d5e3b10f64\n", - "\n", - "90.0\n", + "\n", + "\n", + "sample_3_SimulationCellLength->9afd8477-0e09-4808-8eeb-b6a19d0d1bfd\n", + "\n", + "\n", + "cmso.hasLength_y\n", "\n", - "\n", - "\n", - "SimulationCell_2Angle->74ab88c6-210f-4316-91b9-10d5e3b10f64\n", - "\n", - "\n", - "cmso.hasAngle_gamma\n", + "\n", + "\n", + "sample_2\n", + "\n", + "sample_2\n", "\n", - "\n", - "\n", - "e51bfa9f-869b-49be-bef4-a5e3c449548e\n", - "\n", - "90.0\n", + "\n", + "\n", + "sample_2->cmso.AtomicScaleSample\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "SimulationCell_2Angle->e51bfa9f-869b-49be-bef4-a5e3c449548e\n", - "\n", - "\n", - "cmso.hasAngle_alpha\n", - "\n", - "\n", - "\n", - "0d40b686-f224-467d-a077-e6c8ea3b38d3\n", - "\n", - "90.0\n", - "\n", - "\n", - "\n", - "SimulationCell_2Angle->0d40b686-f224-467d-a077-e6c8ea3b38d3\n", - "\n", - "\n", - "cmso.hasAngle_beta\n", + "\n", + "\n", + "sample_2_Material\n", + "\n", + "sample_2_Material\n", "\n", - "\n", - "\n", - "Sample_2\n", - "\n", - "Sample_2\n", + "\n", + "\n", + "sample_2->sample_2_Material\n", + "\n", + "\n", + "cmso.hasMaterial\n", + "\n", + "\n", + "\n", + "sample_2_ChemicalSpecies\n", + "\n", + "sample_2_ChemicalSpecies\n", + "\n", + "\n", + "\n", + "sample_2->sample_2_ChemicalSpecies\n", + "\n", + "\n", + "cmso.hasSpecies\n", + "\n", + "\n", + "\n", + "sample_2_Position\n", + "\n", + "sample_2_Position\n", + "\n", + "\n", + "\n", + "sample_2->sample_2_Position\n", + "\n", + "\n", + "cmso.hasAttribute\n", + "\n", + "\n", + "\n", + "sample_2_SimulationCell\n", + "\n", + "sample_2_SimulationCell\n", + "\n", + "\n", + "\n", + "sample_2->sample_2_SimulationCell\n", + "\n", + "\n", + "cmso.hasSimulationCell\n", + "\n", + "\n", + "\n", + "sample_2_Species\n", + "\n", + "sample_2_Species\n", + "\n", + "\n", + "\n", + "sample_2->sample_2_Species\n", + "\n", + "\n", + "cmso.hasAttribute\n", + "\n", + "\n", + "\n", + "38373198-728d-4ad7-b7ed-3ebc33692441\n", + "\n", + "8\n", "\n", - "\n", + "\n", + "\n", + "sample_2->38373198-728d-4ad7-b7ed-3ebc33692441\n", + "\n", + "\n", + "cmso.hasNumberOfAtoms\n", + "\n", + "\n", "\n", - "Sample_2->Atom_2_2\n", - "\n", - "\n", - "cmso.hasAtom\n", - "\n", - "\n", - "\n", - "Sample_2->Atom_2_4\n", - "\n", - "\n", - "cmso.hasAtom\n", - "\n", - "\n", - "\n", - "Sample_2->SimulationCell_2\n", - "\n", - "\n", - "cmso.hasSimulationCell\n", - "\n", - "\n", + "sample_2_Material->sample_2_CrystalStructure\n", + "\n", + "\n", + "cmso.hasStructure\n", + "\n", + "\n", + "\n", + "cmso.CrystallineMaterial\n", + "\n", + "cmso.CrystallineMaterial\n", + "\n", + "\n", + "\n", + "sample_2_Material->cmso.CrystallineMaterial\n", + "\n", + "\n", + "type\n", + "\n", + "\n", + "\n", + "sample_1_SimulationCell\n", + "\n", + "sample_1_SimulationCell\n", + "\n", + "\n", + "\n", + "sample_1_SimulationCell->sample_1_SimulationCellVector_3\n", + "\n", + "\n", + "cmso.hasVector\n", + "\n", + "\n", + "\n", + "sample_1_SimulationCell->sample_1_SimulationCellAngle\n", + "\n", + "\n", + "cmso.hasAngle\n", + "\n", + "\n", "\n", - "Atom_2_1\n", - "\n", - "Atom_2_1\n", + "sample_1_SimulationCellVector_2\n", + "\n", + "sample_1_SimulationCellVector_2\n", "\n", - "\n", - "\n", - "Sample_2->Atom_2_1\n", - "\n", - "\n", - "cmso.hasAtom\n", + "\n", + "\n", + "sample_1_SimulationCell->sample_1_SimulationCellVector_2\n", + "\n", + "\n", + "cmso.hasVector\n", "\n", - "\n", - "\n", - "Atom_2_6\n", - "\n", - "Atom_2_6\n", + "\n", + "\n", + "sample_1_SimulationCellLength\n", + "\n", + "sample_1_SimulationCellLength\n", "\n", - "\n", - "\n", - "Sample_2->Atom_2_6\n", - "\n", - "\n", - "cmso.hasAtom\n", + "\n", + "\n", + "sample_1_SimulationCell->sample_1_SimulationCellLength\n", + "\n", + "\n", + "cmso.hasLength\n", "\n", - "\n", - "\n", - "Atom_2_5\n", - "\n", - "Atom_2_5\n", + "\n", + "\n", + "sample_1_SimulationCell->cmso.SimulationCell\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Sample_2->Atom_2_5\n", - "\n", - "\n", - "cmso.hasAtom\n", + "\n", + "\n", + "sample_1_SimulationCellVector_1\n", + "\n", + "sample_1_SimulationCellVector_1\n", "\n", - "\n", - "\n", - "Atom_2_3\n", - "\n", - "Atom_2_3\n", + "\n", + "\n", + "sample_1_SimulationCell->sample_1_SimulationCellVector_1\n", + "\n", + "\n", + "cmso.hasVector\n", + "\n", + "\n", + "\n", + "2755f01f-f7bd-4b89-b26e-e72e90f9487c\n", + "\n", + "1512.95\n", + "\n", + "\n", + "\n", + "sample_1_SimulationCell->2755f01f-f7bd-4b89-b26e-e72e90f9487c\n", + "\n", + "\n", + "cmso.hasVolume\n", + "\n", + "\n", + "\n", + "cmso.SimulationCellLength->cmso.Length\n", + "\n", + "\n", + "subClassOf\n", + "\n", + "\n", + "\n", + "unit.ANGSTROM\n", + "\n", + "unit.ANGSTROM\n", + "\n", + "\n", + "\n", + "cmso.Length->unit.ANGSTROM\n", + "\n", + "\n", + "cmso.hasUnit\n", + "\n", + "\n", + "\n", + "sample_2_SimulationCellVector_2\n", + "\n", + "sample_2_SimulationCellVector_2\n", + "\n", + "\n", + "\n", + "sample_2_SimulationCellVector_2->cmso.SimulationCellVector\n", + "\n", + "\n", + "type\n", + "\n", + "\n", + "\n", + "aa9bcecc-6054-414c-9075-a25635ade7dc\n", + "\n", + "5.43\n", + "\n", + "\n", + "\n", + "sample_2_SimulationCellVector_2->aa9bcecc-6054-414c-9075-a25635ade7dc\n", + "\n", + "\n", + "cmso.hasComponent_y\n", + "\n", + "\n", + "\n", + "aa2f535f-ab88-44ae-a566-ef209e1c7a48\n", + "\n", + "0.0\n", + "\n", + "\n", + "\n", + "sample_2_SimulationCellVector_2->aa2f535f-ab88-44ae-a566-ef209e1c7a48\n", + "\n", + "\n", + "cmso.hasComponent_x\n", "\n", - "\n", + "\n", + "\n", + "5ec4569d-1b12-4f50-afb4-ddd277661066\n", + "\n", + "0.0\n", + "\n", + "\n", + "\n", + "sample_2_SimulationCellVector_2->5ec4569d-1b12-4f50-afb4-ddd277661066\n", + "\n", + "\n", + "cmso.hasComponent_z\n", + "\n", + "\n", + "\n", + "sample_3_SimulationCellVector_3->cmso.SimulationCellVector\n", + "\n", + "\n", + "type\n", + "\n", + "\n", + "\n", + "c8b94f0a-8790-4820-85bc-86fc76e9f43e\n", + "\n", + "0.0\n", + "\n", + "\n", + "\n", + "sample_3_SimulationCellVector_3->c8b94f0a-8790-4820-85bc-86fc76e9f43e\n", + "\n", + "\n", + "cmso.hasComponent_x\n", + "\n", + "\n", + "\n", + "ab4729fb-f47f-4dd0-a7d3-524f13b41e9b\n", + "\n", + "0.0\n", + "\n", + "\n", "\n", - "Sample_2->Atom_2_3\n", - "\n", - "\n", - "cmso.hasAtom\n", + "sample_3_SimulationCellVector_3->ab4729fb-f47f-4dd0-a7d3-524f13b41e9b\n", + "\n", + "\n", + "cmso.hasComponent_y\n", "\n", - "\n", - "\n", - "b58ef121-3040-49de-973e-437347be5bc5\n", - "\n", - "8\n", + "\n", + "\n", + "97a2c6a1-153b-4e01-ac11-47f9b1a4a038\n", + "\n", + "3.57\n", "\n", - "\n", - "\n", - "Sample_2->b58ef121-3040-49de-973e-437347be5bc5\n", - "\n", - "\n", - "cmso.hasNumberOfAtoms\n", + "\n", + "\n", + "sample_3_SimulationCellVector_3->97a2c6a1-153b-4e01-ac11-47f9b1a4a038\n", + "\n", + "\n", + "cmso.hasComponent_z\n", "\n", - "\n", - "\n", - "Material_2\n", - "\n", - "Material_2\n", + "\n", + "\n", + "sample_1_Position\n", + "\n", + "sample_1_Position\n", "\n", - "\n", - "\n", - "Sample_2->Material_2\n", - "\n", - "\n", - "cmso.hasMaterial\n", + "\n", + "\n", + "393940c0-cf9e-4741-ae31-6fbe7d6547f8\n", + "\n", + "Rdf_Structure_Store/1.Json\n", "\n", - "\n", - "\n", - "cmso.AtomicScaleSample\n", - "\n", - "cmso.AtomicScaleSample\n", + "\n", + "\n", + "sample_1_Position->393940c0-cf9e-4741-ae31-6fbe7d6547f8\n", + "\n", + "\n", + "cmso.hasPath\n", "\n", - "\n", - "\n", - "Sample_2->cmso.AtomicScaleSample\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "Atom_2_0\n", - "\n", - "Atom_2_0\n", - "\n", - "\n", - "\n", - "Sample_2->Atom_2_0\n", - "\n", - "\n", - "cmso.hasAtom\n", - "\n", - "\n", - "\n", - "Atom_2_7\n", - "\n", - "Atom_2_7\n", - "\n", - "\n", - "\n", - "Sample_2->Atom_2_7\n", - "\n", - "\n", - "cmso.hasAtom\n", + "\n", + "\n", + "cmso.AtomAttribute\n", + "\n", + "cmso.AtomAttribute\n", "\n", - "\n", - "\n", - "Atom_2_1->cmso.Atom\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "Atom_2_1->Atom_2_1_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", - "\n", - "\n", - "\n", - "Atom_2_1->Atom_2_1_Element\n", - "\n", - "\n", - "cmso.hasElement\n", + "\n", + "\n", + "sample_1_Position->cmso.AtomAttribute\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "268a5752-958b-4c4b-85a9-038e315cfc91\n", - "\n", - "4\n", + "\n", + "\n", + "92b3cd74-2aa4-4944-a672-ca1f8f2c5f7a\n", + "\n", + "Position\n", "\n", - "\n", - "\n", - "Atom_2_1->268a5752-958b-4c4b-85a9-038e315cfc91\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", + "\n", + "\n", + "sample_1_Position->92b3cd74-2aa4-4944-a672-ca1f8f2c5f7a\n", + "\n", + "\n", + "cmso.hasName\n", "\n", - "\n", - "\n", - "Atom_3_1_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "ec7ef95b-2c6b-4e19-b988-a6fd6976d680\n", - "\n", - "Ni\n", - "\n", - "\n", - "\n", - "Atom_3_1_Element->ec7ef95b-2c6b-4e19-b988-a6fd6976d680\n", - "\n", - "\n", - "cmso.hasSymbol\n", - "\n", - "\n", - "\n", - "SimulationCell_1Vector02\n", - "\n", - "SimulationCell_1Vector02\n", + "\n", + "\n", + "a9b4141c-0632-4439-8860-d08951637a81\n", + "\n", + "3D81Bcb3-7B80-44F9-A30E-627166242012\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector02->cmso.SimulationCellVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1_Position->a9b4141c-0632-4439-8860-d08951637a81\n", + "\n", + "\n", + "cmso.hasIdentifier\n", "\n", - "\n", - "\n", - "1b7470fb-a64f-4bdf-a0c6-610f8a984747\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_1_UnitCell->sample_1_LatticeParameter\n", + "\n", + "\n", + "cmso.hasLatticeParamter\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector02->1b7470fb-a64f-4bdf-a0c6-610f8a984747\n", - "\n", - "\n", - "cmso.hasComponent_x\n", - "\n", - "\n", - "\n", - "9161089c-6527-4e0b-be5b-6103455c3dd0\n", - "\n", - "2.87\n", - "\n", - "\n", - "\n", - "SimulationCell_1Vector02->9161089c-6527-4e0b-be5b-6103455c3dd0\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "d616bd4d-7dca-4a97-a565-95dfb0fe73a6\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "SimulationCell_1Vector02->d616bd4d-7dca-4a97-a565-95dfb0fe73a6\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "Atom_2_0_Position\n", - "\n", - "Atom_2_0_Position\n", + "\n", + "\n", + "sample_1_UnitCell->cmso.UnitCell\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_2_0_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1_LatticeAngle\n", + "\n", + "sample_1_LatticeAngle\n", + "\n", + "\n", + "\n", + "sample_1_UnitCell->sample_1_LatticeAngle\n", + "\n", + "\n", + "cmso.hasAngle\n", "\n", - "\n", + "\n", "\n", - "1dee772c-713a-443c-90f9-6a8971a965d3\n", - "\n", - "0.0\n", + "wiki.Q851536\n", + "\n", + "wiki.Q851536\n", "\n", - "\n", - "\n", - "Atom_2_0_Position->1dee772c-713a-443c-90f9-6a8971a965d3\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "sample_1_UnitCell->wiki.Q851536\n", + "\n", + "\n", + "cmso.hasBravaisLattice\n", "\n", - "\n", - "\n", - "18612234-fcc9-4384-afd0-b126f7cb01f1\n", - "\n", - "0.0\n", + "\n", + "\n", + "0287bbb2-00ca-482a-b24d-628e6a39997d\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "Atom_2_0_Position->18612234-fcc9-4384-afd0-b126f7cb01f1\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "sample_1_LatticeAngle->0287bbb2-00ca-482a-b24d-628e6a39997d\n", + "\n", + "\n", + "cmso.hasAngle_beta\n", "\n", - "\n", - "\n", - "2e85e9a6-5390-4a2c-ad10-ac0bee2e73b5\n", - "\n", - "0.0\n", + "\n", + "\n", + "cmso.LatticeAngle\n", + "\n", + "cmso.LatticeAngle\n", "\n", - "\n", - "\n", - "Atom_2_0_Position->2e85e9a6-5390-4a2c-ad10-ac0bee2e73b5\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "\n", + "\n", + "sample_1_LatticeAngle->cmso.LatticeAngle\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "UnitCell_2LatticeParameter\n", - "\n", - "UnitCell_2LatticeParameter\n", + "\n", + "\n", + "dd64d249-4638-4adb-a727-0c6c43e0058e\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "UnitCell_2LatticeParameter->cmso.LatticeParameter\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1_LatticeAngle->dd64d249-4638-4adb-a727-0c6c43e0058e\n", + "\n", + "\n", + "cmso.hasAngle_alpha\n", "\n", - "\n", - "\n", - "ee224841-5428-4ee5-a360-8c89a31bd896\n", - "\n", - "5.43\n", + "\n", + "\n", + "8ed4c927-1ad5-4964-b6f7-ccb251820469\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "UnitCell_2LatticeParameter->ee224841-5428-4ee5-a360-8c89a31bd896\n", - "\n", - "\n", - "cmso.hasLength_z\n", + "\n", + "\n", + "sample_1_LatticeAngle->8ed4c927-1ad5-4964-b6f7-ccb251820469\n", + "\n", + "\n", + "cmso.hasAngle_gamma\n", "\n", - "\n", - "\n", - "b20eb0d1-5370-41b0-ae96-0c73fbd46832\n", - "\n", - "5.43\n", + "\n", + "\n", + "sample_1_SimulationCellVector_2->cmso.SimulationCellVector\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "UnitCell_2LatticeParameter->b20eb0d1-5370-41b0-ae96-0c73fbd46832\n", - "\n", - "\n", - "cmso.hasLength_x\n", - "\n", - "\n", - "\n", - "2ef4ba59-0e4d-4584-89f0-267d46f1f6f9\n", - "\n", - "5.43\n", - "\n", - "\n", - "\n", - "UnitCell_2LatticeParameter->2ef4ba59-0e4d-4584-89f0-267d46f1f6f9\n", - "\n", - "\n", - "cmso.hasLength_y\n", + "\n", + "\n", + "a89d757b-d90a-4552-bf7b-237d8a020921\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "cmso.LatticeParameter->cmso.Length\n", - "\n", - "\n", - "subClassOf\n", + "\n", + "\n", + "sample_1_SimulationCellVector_2->a89d757b-d90a-4552-bf7b-237d8a020921\n", + "\n", + "\n", + "cmso.hasComponent_x\n", "\n", - "\n", - "\n", - "Atom_2_6->Atom_2_6_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", - "\n", - "\n", - "\n", - "Atom_2_6->cmso.Atom\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "Atom_2_6_Element\n", - "\n", - "Atom_2_6_Element\n", + "\n", + "\n", + "c4eace50-1c48-48c1-8a45-809b3285821b\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "Atom_2_6->Atom_2_6_Element\n", - "\n", - "\n", - "cmso.hasElement\n", - "\n", - "\n", - "\n", - "9b4139fe-2b29-4545-b28f-7988427a3326\n", - "\n", - "4\n", - "\n", - "\n", - "\n", - "Atom_2_6->9b4139fe-2b29-4545-b28f-7988427a3326\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", + "\n", + "\n", + "sample_1_SimulationCellVector_2->c4eace50-1c48-48c1-8a45-809b3285821b\n", + "\n", + "\n", + "cmso.hasComponent_y\n", "\n", - "\n", - "\n", - "Atom_2_6_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "ca942d5a-d337-40de-a292-d6a31f807375\n", - "\n", - "Si\n", - "\n", - "\n", - "\n", - "Atom_2_6_Element->ca942d5a-d337-40de-a292-d6a31f807375\n", - "\n", - "\n", - "cmso.hasSymbol\n", - "\n", - "\n", - "\n", - "SimulationCell_3Vector03->cmso.SimulationCellVector\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "01f1147e-296e-4738-9cff-20009b1983b7\n", - "\n", - "0.0\n", + "\n", + "\n", + "f323af76-b88f-42b8-aa4e-ad8aa1b7dca4\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "SimulationCell_3Vector03->01f1147e-296e-4738-9cff-20009b1983b7\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "sample_1_SimulationCellVector_2->f323af76-b88f-42b8-aa4e-ad8aa1b7dca4\n", + "\n", + "\n", + "cmso.hasComponent_z\n", "\n", - "\n", - "\n", - "bdba9aed-bf57-4690-9db8-b4a7e88b174f\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_2_UnitCell->cmso.UnitCell\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "SimulationCell_3Vector03->bdba9aed-bf57-4690-9db8-b4a7e88b174f\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "bf3990d3-b5d0-466b-976f-442490f1b50c\n", - "\n", - "3.57\n", - "\n", - "\n", - "\n", - "SimulationCell_3Vector03->bf3990d3-b5d0-466b-976f-442490f1b50c\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "Atom_2_5->cmso.Atom\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_2_UnitCell->sample_2_LatticeParameter\n", + "\n", + "\n", + "cmso.hasLatticeParamter\n", "\n", - "\n", - "\n", - "Atom_2_5_Position\n", - "\n", - "Atom_2_5_Position\n", + "\n", + "\n", + "sample_2_UnitCell->wiki.Q3006714\n", + "\n", + "\n", + "cmso.hasBravaisLattice\n", "\n", - "\n", - "\n", - "Atom_2_5->Atom_2_5_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", + "\n", + "\n", + "sample_2_LatticeAngle\n", + "\n", + "sample_2_LatticeAngle\n", "\n", - "\n", - "\n", - "Atom_2_5_Element\n", - "\n", - "Atom_2_5_Element\n", - "\n", - "\n", - "\n", - "Atom_2_5->Atom_2_5_Element\n", - "\n", - "\n", - "cmso.hasElement\n", - "\n", - "\n", - "\n", - "081ebee4-67f2-44a3-b720-7b6d88a132b3\n", - "\n", - "4\n", - "\n", - "\n", - "\n", - "Atom_2_5->081ebee4-67f2-44a3-b720-7b6d88a132b3\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", - "\n", - "\n", - "\n", - "Atom_2_5_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_2_UnitCell->sample_2_LatticeAngle\n", + "\n", + "\n", + "cmso.hasAngle\n", "\n", - "\n", + "\n", + "\n", + "sample_1_Species\n", + "\n", + "sample_1_Species\n", + "\n", + "\n", + "\n", + "901188ff-65fd-4b83-a9e6-dc7a25423bb6\n", + "\n", + "Ce0Debfc-1D4B-4764-8B94-77B47F48D422\n", + "\n", + "\n", + "\n", + "sample_1_Species->901188ff-65fd-4b83-a9e6-dc7a25423bb6\n", + "\n", + "\n", + "cmso.hasIdentifier\n", + "\n", + "\n", + "\n", + "sample_1_Species->cmso.AtomAttribute\n", + "\n", + "\n", + "type\n", + "\n", + "\n", + "\n", + "ba33457e-0db5-41cf-b639-3ea070d6ebef\n", + "\n", + "Species\n", + "\n", + "\n", + "\n", + "sample_1_Species->ba33457e-0db5-41cf-b639-3ea070d6ebef\n", + "\n", + "\n", + "cmso.hasName\n", + "\n", + "\n", "\n", - "3c8efbe3-ed01-48cd-838c-bcd38e481a7a\n", - "\n", - "2.715\n", + "33084446-04ea-4570-9471-da8822642c6b\n", + "\n", + "Rdf_Structure_Store/1.Json\n", "\n", - "\n", - "\n", - "Atom_2_5_Position->3c8efbe3-ed01-48cd-838c-bcd38e481a7a\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "662c67a9-8526-4d61-8f3d-9abaa4b1e261\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "Atom_2_5_Position->662c67a9-8526-4d61-8f3d-9abaa4b1e261\n", - "\n", - "\n", - "cmso.hasComponent_x\n", - "\n", - "\n", - "\n", - "619f73fd-676f-452f-bdbe-937446f0507f\n", - "\n", - "2.715\n", - "\n", - "\n", - "\n", - "Atom_2_5_Position->619f73fd-676f-452f-bdbe-937446f0507f\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "cmso.Length->ANGSTROM\n", - "\n", - "\n", - "cmso.hasUnit\n", - "\n", - "\n", - "\n", - "Atom_2_7_Element\n", - "\n", - "Atom_2_7_Element\n", + "\n", + "\n", + "sample_1_Species->33084446-04ea-4570-9471-da8822642c6b\n", + "\n", + "\n", + "cmso.hasPath\n", "\n", - "\n", - "\n", - "Atom_2_7_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "f22ff467-a811-4886-8eb8-7d67fb9568aa\n", - "\n", - "Si\n", - "\n", - "\n", - "\n", - "Atom_2_7_Element->f22ff467-a811-4886-8eb8-7d67fb9568aa\n", - "\n", - "\n", - "cmso.hasSymbol\n", + "\n", + "\n", + "sample_3_Material->sample_3_CrystalStructure\n", + "\n", + "\n", + "cmso.hasStructure\n", + "\n", + "\n", + "\n", + "sample_3_Material->cmso.CrystallineMaterial\n", + "\n", + "\n", + "type\n", + "\n", + "\n", + "\n", + "cmso.ChemicalSpecies\n", + "\n", + "cmso.ChemicalSpecies\n", + "\n", + "\n", + "\n", + "sample_2_ChemicalSpecies->cmso.ChemicalSpecies\n", + "\n", + "\n", + "type\n", + "\n", + "\n", + "\n", + "CHEBI.27573\n", + "\n", + "CHEBI.27573\n", + "\n", + "\n", + "\n", + "sample_2_ChemicalSpecies->CHEBI.27573\n", + "\n", + "\n", + "cmso.hasElement\n", + "\n", + "\n", + "\n", + "11491fd1-f803-4057-b31b-d1fa87c7abec\n", + "\n", + "Rdf_Structure_Store/2.Json\n", + "\n", + "\n", + "\n", + "sample_2_Position->11491fd1-f803-4057-b31b-d1fa87c7abec\n", + "\n", + "\n", + "cmso.hasPath\n", + "\n", + "\n", + "\n", + "sample_2_Position->cmso.AtomAttribute\n", + "\n", + "\n", + "type\n", + "\n", + "\n", + "\n", + "30ddf791-0967-4c86-9baf-6ec1ac1015ea\n", + "\n", + "7A6D56Bb-C918-43A6-8C18-4F0A0Bbb76B4\n", + "\n", + "\n", + "\n", + "sample_2_Position->30ddf791-0967-4c86-9baf-6ec1ac1015ea\n", + "\n", + "\n", + "cmso.hasIdentifier\n", + "\n", + "\n", + "\n", + "ed5bd5f9-486a-4e9e-9f38-b0e9859812e2\n", + "\n", + "Position\n", + "\n", + "\n", + "\n", + "sample_2_Position->ed5bd5f9-486a-4e9e-9f38-b0e9859812e2\n", + "\n", + "\n", + "cmso.hasName\n", + "\n", + "\n", + "\n", + "sample_1_SimulationCellLength->cmso.SimulationCellLength\n", + "\n", + "\n", + "type\n", + "\n", + "\n", + "\n", + "f12b0697-bf5a-481c-8e9c-a9d9c3637803\n", + "\n", + "2.87\n", + "\n", + "\n", + "\n", + "sample_1_SimulationCellLength->f12b0697-bf5a-481c-8e9c-a9d9c3637803\n", + "\n", + "\n", + "cmso.hasLength_z\n", + "\n", + "\n", + "\n", + "b65ae2ac-13f4-42e0-8e4d-00725e79d218\n", + "\n", + "2.87\n", + "\n", + "\n", + "\n", + "sample_1_SimulationCellLength->b65ae2ac-13f4-42e0-8e4d-00725e79d218\n", + "\n", + "\n", + "cmso.hasLength_y\n", + "\n", + "\n", + "\n", + "637d543a-215b-4a9a-a51c-8f991586ea27\n", + "\n", + "2.87\n", + "\n", + "\n", + "\n", + "sample_1_SimulationCellLength->637d543a-215b-4a9a-a51c-8f991586ea27\n", + "\n", + "\n", + "cmso.hasLength_x\n", + "\n", + "\n", + "\n", + "sample_1\n", + "\n", + "sample_1\n", + "\n", + "\n", + "\n", + "sample_1->cmso.AtomicScaleSample\n", + "\n", + "\n", + "type\n", + "\n", + "\n", + "\n", + "sample_1->sample_1_SimulationCell\n", + "\n", + "\n", + "cmso.hasSimulationCell\n", "\n", - "\n", - "\n", - "UnitCell_3LatticeAngle->cmso.LatticeAngle\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1->sample_1_Position\n", + "\n", + "\n", + "cmso.hasAttribute\n", "\n", - "\n", - "\n", - "51520df7-9c2c-4ea6-a1b8-8e7a1234a26e\n", - "\n", - "90\n", + "\n", + "\n", + "sample_1->sample_1_Species\n", + "\n", + "\n", + "cmso.hasAttribute\n", "\n", - "\n", - "\n", - "UnitCell_3LatticeAngle->51520df7-9c2c-4ea6-a1b8-8e7a1234a26e\n", - "\n", - "\n", - "cmso.hasAngle_beta\n", + "\n", + "\n", + "sample_1_ChemicalSpecies\n", + "\n", + "sample_1_ChemicalSpecies\n", "\n", - "\n", - "\n", - "4f1dfd3d-c277-46c1-b7e9-af9324f42674\n", - "\n", - "90\n", + "\n", + "\n", + "sample_1->sample_1_ChemicalSpecies\n", + "\n", + "\n", + "cmso.hasSpecies\n", "\n", - "\n", - "\n", - "UnitCell_3LatticeAngle->4f1dfd3d-c277-46c1-b7e9-af9324f42674\n", - "\n", - "\n", - "cmso.hasAngle_alpha\n", - "\n", - "\n", - "\n", - "b9def036-6637-4ab0-bc72-ae5b33a6618d\n", - "\n", - "90\n", - "\n", - "\n", - "\n", - "UnitCell_3LatticeAngle->b9def036-6637-4ab0-bc72-ae5b33a6618d\n", - "\n", - "\n", - "cmso.hasAngle_gamma\n", - "\n", - "\n", - "\n", - "Atom_3_2\n", - "\n", - "Atom_3_2\n", + "\n", + "\n", + "a3cd1c5e-b6b2-427b-829d-161922eaca04\n", + "\n", + "2\n", "\n", - "\n", - "\n", - "Atom_3_2->cmso.Atom\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1->a3cd1c5e-b6b2-427b-829d-161922eaca04\n", + "\n", + "\n", + "cmso.hasNumberOfAtoms\n", "\n", - "\n", - "\n", - "Atom_3_2_Element\n", - "\n", - "Atom_3_2_Element\n", + "\n", + "\n", + "sample_1_Material\n", + "\n", + "sample_1_Material\n", "\n", - "\n", - "\n", - "Atom_3_2->Atom_3_2_Element\n", - "\n", - "\n", - "cmso.hasElement\n", + "\n", + "\n", + "sample_1->sample_1_Material\n", + "\n", + "\n", + "cmso.hasMaterial\n", "\n", - "\n", - "\n", - "7d6f03cc-b329-4d29-9364-8985f72d6fc0\n", - "\n", - "12\n", + "\n", + "\n", + "sample_1_ChemicalSpecies->cmso.ChemicalSpecies\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_3_2->7d6f03cc-b329-4d29-9364-8985f72d6fc0\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", + "\n", + "\n", + "CHEBI.18248\n", + "\n", + "CHEBI.18248\n", "\n", - "\n", - "\n", - "Atom_3_2_Position\n", - "\n", - "Atom_3_2_Position\n", + "\n", + "\n", + "sample_1_ChemicalSpecies->CHEBI.18248\n", + "\n", + "\n", + "cmso.hasElement\n", "\n", - "\n", - "\n", - "Atom_3_2->Atom_3_2_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", + "\n", + "\n", + "CHEBI.27573->cmso.Element\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_3_2_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "7abbb511-c984-467a-ac01-a05efbbd12ef\n", - "\n", - "Ni\n", - "\n", - "\n", - "\n", - "Atom_3_2_Element->7abbb511-c984-467a-ac01-a05efbbd12ef\n", - "\n", - "\n", - "cmso.hasSymbol\n", - "\n", - "\n", - "\n", - "UnitCell_3LatticeParameter->cmso.LatticeParameter\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "1d23d1ac-c0e7-4c45-8785-46c26c1a5f1e\n", - "\n", - "3.57\n", + "\n", + "\n", + "0995011e-a1da-4b76-a5ba-407377adb35f\n", + "\n", + "1.0\n", "\n", - "\n", - "\n", - "UnitCell_3LatticeParameter->1d23d1ac-c0e7-4c45-8785-46c26c1a5f1e\n", - "\n", - "\n", - "cmso.hasLength_y\n", + "\n", + "\n", + "CHEBI.27573->0995011e-a1da-4b76-a5ba-407377adb35f\n", + "\n", + "\n", + "cmso.hasElementRatio\n", "\n", - "\n", - "\n", - "b6ca51af-1b8e-4664-a56a-aec8068a593b\n", - "\n", - "3.57\n", + "\n", + "\n", + "45ee9e3d-8676-4b36-af42-03f6b4b6985b\n", + "\n", + "Si\n", "\n", - "\n", - "\n", - "UnitCell_3LatticeParameter->b6ca51af-1b8e-4664-a56a-aec8068a593b\n", - "\n", - "\n", - "cmso.hasLength_z\n", - "\n", - "\n", - "\n", - "8df14f3a-66b7-4198-9898-7b788e1e654f\n", - "\n", - "3.57\n", - "\n", - "\n", - "\n", - "UnitCell_3LatticeParameter->8df14f3a-66b7-4198-9898-7b788e1e654f\n", - "\n", - "\n", - "cmso.hasLength_x\n", - "\n", - "\n", - "\n", - "Atom_2_3_Position\n", - "\n", - "Atom_2_3_Position\n", + "\n", + "\n", + "CHEBI.27573->45ee9e3d-8676-4b36-af42-03f6b4b6985b\n", + "\n", + "\n", + "cmso.hasSymbol\n", "\n", - "\n", - "\n", - "Atom_2_3_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_1_Material->sample_1_CrystalStructure\n", + "\n", + "\n", + "cmso.hasStructure\n", "\n", - "\n", - "\n", - "f1ac1457-9aa5-453c-bcfe-12af1ed960cd\n", - "\n", - "4.0725\n", + "\n", + "\n", + "sample_1_Material->cmso.CrystallineMaterial\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_2_3_Position->f1ac1457-9aa5-453c-bcfe-12af1ed960cd\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "unit.DEG\n", + "\n", + "unit.DEG\n", "\n", - "\n", - "\n", - "c25f0423-b3e2-4158-9a72-944ffbaf861c\n", - "\n", - "4.0725\n", + "\n", + "\n", + "cmso.Angle->unit.DEG\n", + "\n", + "\n", + "cmso.hasUnit\n", "\n", - "\n", - "\n", - "Atom_2_3_Position->c25f0423-b3e2-4158-9a72-944ffbaf861c\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "fe7a97a7-c8f3-4686-a9d4-b2ef3e542ca7\n", - "\n", - "1.3575\n", - "\n", - "\n", - "\n", - "Atom_2_3_Position->fe7a97a7-c8f3-4686-a9d4-b2ef3e542ca7\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "UnitCell_2\n", - "\n", - "UnitCell_2\n", + "\n", + "\n", + "cmso.LatticeAngle->cmso.Angle\n", + "\n", + "\n", + "subClassOf\n", "\n", - "\n", - "\n", - "UnitCell_2->UnitCell_2LatticeParameter\n", - "\n", - "\n", - "cmso.hasLatticeParamter\n", + "\n", + "\n", + "sample_3_Species->cmso.AtomAttribute\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "UnitCell_2LatticeAngle\n", - "\n", - "UnitCell_2LatticeAngle\n", + "\n", + "\n", + "33272bbe-13df-4d49-8920-80adac21969e\n", + "\n", + "Species\n", "\n", - "\n", - "\n", - "UnitCell_2->UnitCell_2LatticeAngle\n", - "\n", - "\n", - "cmso.hasAngle\n", + "\n", + "\n", + "sample_3_Species->33272bbe-13df-4d49-8920-80adac21969e\n", + "\n", + "\n", + "cmso.hasName\n", "\n", - "\n", - "\n", - "UnitCell_2->cmso.UnitCell\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "1d9586a3-7eff-40ba-ba58-7dc09acbd460\n", + "\n", + "Rdf_Structure_Store/3.Json\n", "\n", - "\n", - "\n", - "UnitCell_2->wiki.Q3006714\n", - "\n", - "\n", - "cmso.hasBravaisLattice\n", + "\n", + "\n", + "sample_3_Species->1d9586a3-7eff-40ba-ba58-7dc09acbd460\n", + "\n", + "\n", + "cmso.hasPath\n", "\n", - "\n", - "\n", - "Atom_2_3->cmso.Atom\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "89a3ef9f-2b7e-4da4-82aa-18ce39e09b76\n", + "\n", + "598D8Fec-2814-47Ee-Bb49-B9Dece57B380\n", "\n", - "\n", - "\n", - "Atom_2_3->Atom_2_3_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", + "\n", + "\n", + "sample_3_Species->89a3ef9f-2b7e-4da4-82aa-18ce39e09b76\n", + "\n", + "\n", + "cmso.hasIdentifier\n", "\n", - "\n", - "\n", - "Atom_2_3_Element\n", - "\n", - "Atom_2_3_Element\n", - "\n", - "\n", - "\n", - "Atom_2_3->Atom_2_3_Element\n", - "\n", - "\n", - "cmso.hasElement\n", - "\n", - "\n", - "\n", - "b1b3e461-686e-431e-a264-df8272216007\n", - "\n", - "4\n", + "\n", + "\n", + "sample_3_LatticeAngle->cmso.LatticeAngle\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_2_3->b1b3e461-686e-431e-a264-df8272216007\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", + "\n", + "\n", + "cc2f0150-fd9a-4550-86c8-a1e6c3c9a861\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "Atom_3_0_Position\n", - "\n", - "Atom_3_0_Position\n", + "\n", + "\n", + "sample_3_LatticeAngle->cc2f0150-fd9a-4550-86c8-a1e6c3c9a861\n", + "\n", + "\n", + "cmso.hasAngle_alpha\n", "\n", - "\n", - "\n", - "Atom_3_0_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "33c62d81-acda-42e1-95e3-8b1300cb629d\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "d13faeac-234c-4324-ac11-95e7f9ab3791\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_3_LatticeAngle->33c62d81-acda-42e1-95e3-8b1300cb629d\n", + "\n", + "\n", + "cmso.hasAngle_gamma\n", "\n", - "\n", - "\n", - "Atom_3_0_Position->d13faeac-234c-4324-ac11-95e7f9ab3791\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "\n", + "\n", + "6c79f564-6ad6-4fb8-99f8-30384e794b40\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "b32aaa7a-c24d-4251-a64a-f2eebe0214bb\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_3_LatticeAngle->6c79f564-6ad6-4fb8-99f8-30384e794b40\n", + "\n", + "\n", + "cmso.hasAngle_beta\n", "\n", - "\n", - "\n", - "Atom_3_0_Position->b32aaa7a-c24d-4251-a64a-f2eebe0214bb\n", - "\n", - "\n", - "cmso.hasComponent_x\n", - "\n", - "\n", - "\n", - "188d1e2d-0447-43bb-b531-0923318910ab\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "Atom_3_0_Position->188d1e2d-0447-43bb-b531-0923318910ab\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "Atom_3_3\n", - "\n", - "Atom_3_3\n", + "\n", + "\n", + "sample_2_SimulationCell->sample_2_SimulationCellAngle\n", + "\n", + "\n", + "cmso.hasAngle\n", "\n", - "\n", - "\n", - "Atom_3_3->cmso.Atom\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_2_SimulationCell->sample_2_SimulationCellVector_3\n", + "\n", + "\n", + "cmso.hasVector\n", "\n", - "\n", - "\n", - "Atom_3_3_Element\n", - "\n", - "Atom_3_3_Element\n", + "\n", + "\n", + "sample_2_SimulationCell->sample_2_SimulationCellLength\n", + "\n", + "\n", + "cmso.hasLength\n", "\n", - "\n", - "\n", - "Atom_3_3->Atom_3_3_Element\n", - "\n", - "\n", - "cmso.hasElement\n", + "\n", + "\n", + "sample_2_SimulationCell->sample_2_SimulationCellVector_1\n", + "\n", + "\n", + "cmso.hasVector\n", "\n", - "\n", - "\n", - "Atom_3_3_Position\n", - "\n", - "Atom_3_3_Position\n", + "\n", + "\n", + "sample_2_SimulationCell->sample_2_SimulationCellVector_2\n", + "\n", + "\n", + "cmso.hasVector\n", "\n", - "\n", - "\n", - "Atom_3_3->Atom_3_3_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", - "\n", - "\n", - "\n", - "f0f4064a-a41c-448c-bf23-4a227c9b2d74\n", - "\n", - "12\n", - "\n", - "\n", - "\n", - "Atom_3_3->f0f4064a-a41c-448c-bf23-4a227c9b2d74\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", - "\n", - "\n", - "\n", - "Atom_3_3_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "40d5a17f-3a05-40d6-bfef-eea7a57d170b\n", - "\n", - "Ni\n", - "\n", - "\n", - "\n", - "Atom_3_3_Element->40d5a17f-3a05-40d6-bfef-eea7a57d170b\n", - "\n", - "\n", - "cmso.hasSymbol\n", + "\n", + "\n", + "sample_2_SimulationCell->cmso.SimulationCell\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_3_1_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "c1d8fd24-ae82-4300-bebd-6d711eda408c\n", + "\n", + "1280.82\n", "\n", - "\n", - "\n", - "72d5bb6a-d28e-40b7-a962-d1f266e7055f\n", - "\n", - "1.785\n", + "\n", + "\n", + "sample_2_SimulationCell->c1d8fd24-ae82-4300-bebd-6d711eda408c\n", + "\n", + "\n", + "cmso.hasVolume\n", "\n", - "\n", - "\n", - "Atom_3_1_Position->72d5bb6a-d28e-40b7-a962-d1f266e7055f\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "d52821a4-7b43-4e71-b820-1331a7d9c858\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "Atom_3_1_Position->d52821a4-7b43-4e71-b820-1331a7d9c858\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "ae5733e6-4a94-4ce6-86cc-ba6d10d754bd\n", - "\n", - "1.785\n", - "\n", - "\n", - "\n", - "Atom_3_1_Position->ae5733e6-4a94-4ce6-86cc-ba6d10d754bd\n", - "\n", - "\n", - "cmso.hasComponent_x\n", - "\n", - "\n", - "\n", - "CrystalStructure_2\n", - "\n", - "CrystalStructure_2\n", - "\n", - "\n", - "\n", - "CrystalStructure_2->UnitCell_2\n", - "\n", - "\n", - "cmso.hasUnitCell\n", - "\n", - "\n", - "\n", - "8d316e78-b1de-46ea-a908-5a0cb19f4d7a\n", - "\n", - "Diamond\n", + "\n", + "\n", + "CHEBI.28984\n", + "\n", + "CHEBI.28984\n", "\n", - "\n", - "\n", - "CrystalStructure_2->8d316e78-b1de-46ea-a908-5a0cb19f4d7a\n", - "\n", - "\n", - "cmso.hasAltName\n", - "\n", - "\n", - "\n", - "CrystalStructure_2->cmso.CrystalStructure\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "67b50f81-df15-4451-98ed-7ce588546e39\n", - "\n", - "227\n", + "\n", + "\n", + "CHEBI.28984->cmso.Element\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "CrystalStructure_2->67b50f81-df15-4451-98ed-7ce588546e39\n", - "\n", - "\n", - "cmso.hasSpaceGroupNumber\n", - "\n", - "\n", - "\n", - "c5268f64-638f-42d3-8c7c-278af43c8177\n", - "\n", - "Fd-3M\n", - "\n", - "\n", - "\n", - "CrystalStructure_2->c5268f64-638f-42d3-8c7c-278af43c8177\n", - "\n", - "\n", - "cmso.hasSpaceGroupSymbol\n", - "\n", - "\n", - "\n", - "Sample_3\n", - "\n", - "Sample_3\n", - "\n", - "\n", - "\n", - "Sample_3->SimulationCell_3\n", - "\n", - "\n", - "cmso.hasSimulationCell\n", - "\n", - "\n", - "\n", - "Sample_3->Atom_3_1\n", - "\n", - "\n", - "cmso.hasAtom\n", - "\n", - "\n", - "\n", - "Sample_3->Atom_3_2\n", - "\n", - "\n", - "cmso.hasAtom\n", - "\n", - "\n", - "\n", - "Sample_3->Atom_3_3\n", - "\n", - "\n", - "cmso.hasAtom\n", + "\n", + "\n", + "771b2cfe-0b18-4d89-9b7b-54456c35cb99\n", + "\n", + "Al\n", "\n", - "\n", - "\n", - "Atom_3_0\n", - "\n", - "Atom_3_0\n", + "\n", + "\n", + "CHEBI.28984->771b2cfe-0b18-4d89-9b7b-54456c35cb99\n", + "\n", + "\n", + "cmso.hasSymbol\n", "\n", - "\n", - "\n", - "Sample_3->Atom_3_0\n", - "\n", - "\n", - "cmso.hasAtom\n", + "\n", + "\n", + "5663a256-c5d7-46fa-a8d3-5f01daf75536\n", + "\n", + "0.25\n", "\n", - "\n", - "\n", - "Material_3\n", - "\n", - "Material_3\n", + "\n", + "\n", + "CHEBI.28984->5663a256-c5d7-46fa-a8d3-5f01daf75536\n", + "\n", + "\n", + "cmso.hasElementRatio\n", "\n", - "\n", - "\n", - "Sample_3->Material_3\n", - "\n", - "\n", - "cmso.hasMaterial\n", + "\n", + "\n", + "sample_3_LatticeParameter->cmso.LatticeParameter\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Sample_3->cmso.AtomicScaleSample\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "9fcec19f-f8e4-4cbb-abbf-e889b33c53db\n", - "\n", - "4\n", - "\n", - "\n", - "\n", - "Sample_3->9fcec19f-f8e4-4cbb-abbf-e889b33c53db\n", - "\n", - "\n", - "cmso.hasNumberOfAtoms\n", - "\n", - "\n", - "\n", - "Sample_1\n", - "\n", - "Sample_1\n", + "\n", + "\n", + "bc3f82d9-9a5f-492d-9755-24b1ad13cc0b\n", + "\n", + "3.57\n", "\n", - "\n", - "\n", - "Sample_1->Material_1\n", - "\n", - "\n", - "cmso.hasMaterial\n", + "\n", + "\n", + "sample_3_LatticeParameter->bc3f82d9-9a5f-492d-9755-24b1ad13cc0b\n", + "\n", + "\n", + "cmso.hasLength_z\n", "\n", - "\n", - "\n", - "Sample_1->Atom_1_1\n", - "\n", - "\n", - "cmso.hasAtom\n", + "\n", + "\n", + "eef096cb-590f-44d1-84fe-3da1a55b903c\n", + "\n", + "3.57\n", "\n", - "\n", - "\n", - "Atom_1_0\n", - "\n", - "Atom_1_0\n", + "\n", + "\n", + "sample_3_LatticeParameter->eef096cb-590f-44d1-84fe-3da1a55b903c\n", + "\n", + "\n", + "cmso.hasLength_y\n", "\n", - "\n", - "\n", - "Sample_1->Atom_1_0\n", - "\n", - "\n", - "cmso.hasAtom\n", + "\n", + "\n", + "5dbf2e24-f496-44b7-9c95-0d981306f900\n", + "\n", + "3.57\n", "\n", - "\n", - "\n", - "SimulationCell_1\n", - "\n", - "SimulationCell_1\n", + "\n", + "\n", + "sample_3_LatticeParameter->5dbf2e24-f496-44b7-9c95-0d981306f900\n", + "\n", + "\n", + "cmso.hasLength_x\n", "\n", - "\n", - "\n", - "Sample_1->SimulationCell_1\n", - "\n", - "\n", - "cmso.hasSimulationCell\n", + "\n", + "\n", + "CHEBI.18248->cmso.Element\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "e415c0f7-91aa-42db-9743-cbff977cd455\n", - "\n", - "2\n", + "\n", + "\n", + "b2f0d9e3-3434-4de6-9842-7bf7f5c1118d\n", + "\n", + "1.0\n", "\n", - "\n", - "\n", - "Sample_1->e415c0f7-91aa-42db-9743-cbff977cd455\n", - "\n", - "\n", - "cmso.hasNumberOfAtoms\n", - "\n", - "\n", - "\n", - "Sample_1->cmso.AtomicScaleSample\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "Atom_1_0->cmso.Atom\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "CHEBI.18248->b2f0d9e3-3434-4de6-9842-7bf7f5c1118d\n", + "\n", + "\n", + "cmso.hasElementRatio\n", "\n", - "\n", - "\n", - "Atom_1_0_Position\n", - "\n", - "Atom_1_0_Position\n", - "\n", - "\n", - "\n", - "Atom_1_0->Atom_1_0_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", - "\n", - "\n", - "\n", - "Atom_1_0_Element\n", - "\n", - "Atom_1_0_Element\n", - "\n", - "\n", - "\n", - "Atom_1_0->Atom_1_0_Element\n", - "\n", - "\n", - "cmso.hasElement\n", - "\n", - "\n", - "\n", - "32e58ae6-dcb4-4961-9d16-b267cc70d79c\n", - "\n", - "14\n", - "\n", - "\n", - "\n", - "Atom_1_0->32e58ae6-dcb4-4961-9d16-b267cc70d79c\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", - "\n", - "\n", - "\n", - "Atom_3_0->cmso.Atom\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "d2a0dc90-5c22-407d-ab42-38c7b4c8fb21\n", + "\n", + "Fe\n", "\n", - "\n", - "\n", - "Atom_3_0->Atom_3_0_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", + "\n", + "\n", + "CHEBI.18248->d2a0dc90-5c22-407d-ab42-38c7b4c8fb21\n", + "\n", + "\n", + "cmso.hasSymbol\n", "\n", - "\n", - "\n", - "Atom_3_0_Element\n", - "\n", - "Atom_3_0_Element\n", + "\n", + "\n", + "sample_1_SimulationCellVector_1->cmso.SimulationCellVector\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_3_0->Atom_3_0_Element\n", - "\n", - "\n", - "cmso.hasElement\n", - "\n", - "\n", - "\n", - "483d6582-ff11-4598-a4b8-88cc87a034b5\n", - "\n", - "12\n", - "\n", - "\n", - "\n", - "Atom_3_0->483d6582-ff11-4598-a4b8-88cc87a034b5\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", - "\n", - "\n", - "\n", - "Atom_3_0_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "92f581ad-92b6-4174-9025-6ffd96579654\n", - "\n", - "Al\n", + "\n", + "\n", + "3f4564dc-19e8-4aca-b206-698c79942478\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "Atom_3_0_Element->92f581ad-92b6-4174-9025-6ffd96579654\n", - "\n", - "\n", - "cmso.hasSymbol\n", - "\n", - "\n", - "\n", - "SimulationCell_1->SimulationCell_1Length\n", - "\n", - "\n", - "cmso.hasLength\n", - "\n", - "\n", - "\n", - "SimulationCell_1->cmso.SimulationCell\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "SimulationCell_1->SimulationCell_1Angle\n", - "\n", - "\n", - "cmso.hasAngle\n", - "\n", - "\n", - "\n", - "SimulationCell_1->SimulationCell_1Vector03\n", - "\n", - "\n", - "cmso.hasVector\n", - "\n", - "\n", - "\n", - "SimulationCell_1->SimulationCell_1Vector02\n", - "\n", - "\n", - "cmso.hasVector\n", + "\n", + "\n", + "sample_1_SimulationCellVector_1->3f4564dc-19e8-4aca-b206-698c79942478\n", + "\n", + "\n", + "cmso.hasComponent_z\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector01\n", - "\n", - "SimulationCell_1Vector01\n", - "\n", - "\n", - "\n", - "SimulationCell_1->SimulationCell_1Vector01\n", - "\n", - "\n", - "cmso.hasVector\n", - "\n", - "\n", - "\n", - "c11bd54e-ca01-496e-8f38-98fbc77be09a\n", - "\n", - "1512.95\n", - "\n", - "\n", - "\n", - "SimulationCell_1->c11bd54e-ca01-496e-8f38-98fbc77be09a\n", - "\n", - "\n", - "cmso.hasVolume\n", - "\n", - "\n", - "\n", - "Atom_1_0_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "a65391b9-051f-4845-b3c6-b3f83c6c85d6\n", - "\n", - "0.0\n", + "\n", + "\n", + "966a8636-c992-4eb6-b368-0f9d93df5e2a\n", + "\n", + "0.0\n", "\n", - "\n", - "\n", - "Atom_1_0_Position->a65391b9-051f-4845-b3c6-b3f83c6c85d6\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "sample_1_SimulationCellVector_1->966a8636-c992-4eb6-b368-0f9d93df5e2a\n", + "\n", + "\n", + "cmso.hasComponent_y\n", "\n", - "\n", - "\n", - "14a331de-7966-43c0-848b-9dd024ccd5c8\n", - "\n", - "0.0\n", + "\n", + "\n", + "2cfa6098-8e57-4791-9465-b347d29e3087\n", + "\n", + "2.87\n", "\n", - "\n", - "\n", - "Atom_1_0_Position->14a331de-7966-43c0-848b-9dd024ccd5c8\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "bf311e0e-132d-458d-a728-b862fe2d7ca5\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "Atom_1_0_Position->bf311e0e-132d-458d-a728-b862fe2d7ca5\n", - "\n", - "\n", - "cmso.hasComponent_x\n", - "\n", - "\n", - "\n", - "UnitCell_2LatticeAngle->cmso.LatticeAngle\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "fa1be7e2-3e4e-4a83-9ccb-a76762451091\n", - "\n", - "90\n", + "\n", + "\n", + "sample_1_SimulationCellVector_1->2cfa6098-8e57-4791-9465-b347d29e3087\n", + "\n", + "\n", + "cmso.hasComponent_x\n", "\n", - "\n", - "\n", - "UnitCell_2LatticeAngle->fa1be7e2-3e4e-4a83-9ccb-a76762451091\n", - "\n", - "\n", - "cmso.hasAngle_alpha\n", - "\n", - "\n", - "\n", - "5c49ac27-a5e2-4f16-bc97-c8b78d4485a8\n", - "\n", - "90\n", - "\n", - "\n", - "\n", - "UnitCell_2LatticeAngle->5c49ac27-a5e2-4f16-bc97-c8b78d4485a8\n", - "\n", - "\n", - "cmso.hasAngle_gamma\n", - "\n", - "\n", - "\n", - "35722a5a-d7a7-44cc-97b5-5e2b96ef6cfa\n", - "\n", - "90\n", - "\n", - "\n", - "\n", - "UnitCell_2LatticeAngle->35722a5a-d7a7-44cc-97b5-5e2b96ef6cfa\n", - "\n", - "\n", - "cmso.hasAngle_beta\n", - "\n", - "\n", - "\n", - "Atom_3_3_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_2_Species->cmso.AtomAttribute\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "ef3a964b-81f2-40ca-9f38-2cb93d37a36a\n", - "\n", - "1.785\n", + "\n", + "\n", + "fb3e4213-df77-4b6b-845c-d0794e0772c2\n", + "\n", + "Species\n", "\n", - "\n", - "\n", - "Atom_3_3_Position->ef3a964b-81f2-40ca-9f38-2cb93d37a36a\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "sample_2_Species->fb3e4213-df77-4b6b-845c-d0794e0772c2\n", + "\n", + "\n", + "cmso.hasName\n", "\n", - "\n", - "\n", - "dd97dd71-c9a6-4b39-88ab-9f8a5ba752bc\n", - "\n", - "0.0\n", + "\n", + "\n", + "47606d54-d36a-4552-bdd8-f16706edefda\n", + "\n", + "Rdf_Structure_Store/2.Json\n", "\n", - "\n", - "\n", - "Atom_3_3_Position->dd97dd71-c9a6-4b39-88ab-9f8a5ba752bc\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "\n", + "\n", + "sample_2_Species->47606d54-d36a-4552-bdd8-f16706edefda\n", + "\n", + "\n", + "cmso.hasPath\n", "\n", - "\n", - "\n", - "391a1f34-8322-4342-a0d1-ad8b8f9c53d2\n", - "\n", - "1.785\n", + "\n", + "\n", + "9514dd6c-3077-410a-acfc-0496af5ad452\n", + "\n", + "69C6Fee5-4884-43Bf-86E0-08960D56179F\n", "\n", - "\n", - "\n", - "Atom_3_3_Position->391a1f34-8322-4342-a0d1-ad8b8f9c53d2\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "sample_2_Species->9514dd6c-3077-410a-acfc-0496af5ad452\n", + "\n", + "\n", + "cmso.hasIdentifier\n", "\n", - "\n", - "\n", - "Atom_1_1_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "3fcd5914-10e5-4717-a6c4-e7d47cda0946\n", - "\n", - "Fe\n", - "\n", - "\n", - "\n", - "Atom_1_1_Element->3fcd5914-10e5-4717-a6c4-e7d47cda0946\n", - "\n", - "\n", - "cmso.hasSymbol\n", - "\n", - "\n", - "\n", - "SimulationCell_3Vector01->cmso.SimulationCellVector\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "0d12ea6e-0144-49ac-a99d-b2e6dbf3f186\n", - "\n", - "3.57\n", + "\n", + "\n", + "cmso.LatticeVector\n", + "\n", + "cmso.LatticeVector\n", "\n", - "\n", - "\n", - "SimulationCell_3Vector01->0d12ea6e-0144-49ac-a99d-b2e6dbf3f186\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "cmso.LatticeVector->cmso.Vector\n", + "\n", + "\n", + "subClassOf\n", "\n", - "\n", - "\n", - "7c402b6b-5348-479c-82cb-055a4c412883\n", - "\n", - "0.0\n", + "\n", + "\n", + "cmso.Vector->unit.ANGSTROM\n", + "\n", + "\n", + "cmso.hasUnit\n", "\n", - "\n", - "\n", - "SimulationCell_3Vector01->7c402b6b-5348-479c-82cb-055a4c412883\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "7c4f2639-3963-483d-a918-5691d955ddb1\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "SimulationCell_3Vector01->7c4f2639-3963-483d-a918-5691d955ddb1\n", - "\n", - "\n", - "cmso.hasComponent_z\n", + "\n", + "\n", + "sample_3_Position->cmso.AtomAttribute\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Atom_3_2_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "f2751d26-eef7-4b31-8618-56fd06ff5d2d\n", + "\n", + "Position\n", "\n", - "\n", - "\n", - "19ad562d-9122-45e6-822e-1e2e09c3162b\n", - "\n", - "1.785\n", + "\n", + "\n", + "sample_3_Position->f2751d26-eef7-4b31-8618-56fd06ff5d2d\n", + "\n", + "\n", + "cmso.hasName\n", "\n", - "\n", - "\n", - "Atom_3_2_Position->19ad562d-9122-45e6-822e-1e2e09c3162b\n", - "\n", - "\n", - "cmso.hasComponent_y\n", + "\n", + "\n", + "b230686c-3352-4fd3-9975-f6eb56750672\n", + "\n", + "Rdf_Structure_Store/3.Json\n", "\n", - "\n", - "\n", - "7a510b1a-0d50-4284-899c-ce1b21aec79e\n", - "\n", - "0.0\n", + "\n", + "\n", + "sample_3_Position->b230686c-3352-4fd3-9975-f6eb56750672\n", + "\n", + "\n", + "cmso.hasPath\n", "\n", - "\n", - "\n", - "Atom_3_2_Position->7a510b1a-0d50-4284-899c-ce1b21aec79e\n", - "\n", - "\n", - "cmso.hasComponent_x\n", + "\n", + "\n", + "b2d7e7d0-16b4-4cc1-86f3-6a83abbe8ced\n", + "\n", + "C3674434-23Ab-41B3-996E-2F67130Bd404\n", "\n", - "\n", - "\n", - "b1c972c5-245a-4d7e-96c5-0ae42a2ca40b\n", - "\n", - "1.785\n", + "\n", + "\n", + "sample_3_Position->b2d7e7d0-16b4-4cc1-86f3-6a83abbe8ced\n", + "\n", + "\n", + "cmso.hasIdentifier\n", "\n", - "\n", - "\n", - "Atom_3_2_Position->b1c972c5-245a-4d7e-96c5-0ae42a2ca40b\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "DEG\n", - "\n", - "DEG\n", - "\n", - "\n", - "\n", - "cmso.Angle->DEG\n", - "\n", - "\n", - "cmso.hasUnit\n", - "\n", - "\n", - "\n", - "SimulationCell_2Vector01->cmso.SimulationCellVector\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "b351149e-fe9a-4541-9d2c-11af1dd1af2f\n", - "\n", - "0.0\n", + "\n", + "\n", + "cmso.PositionVector\n", + "\n", + "cmso.PositionVector\n", "\n", - "\n", - "\n", - "SimulationCell_2Vector01->b351149e-fe9a-4541-9d2c-11af1dd1af2f\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "12cc7b49-c5ef-4d93-bb6d-dd0a93c3cc93\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "SimulationCell_2Vector01->12cc7b49-c5ef-4d93-bb6d-dd0a93c3cc93\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "12e08f35-aa0b-4566-824b-02e77b181605\n", - "\n", - "5.43\n", - "\n", - "\n", - "\n", - "SimulationCell_2Vector01->12e08f35-aa0b-4566-824b-02e77b181605\n", - "\n", - "\n", - "cmso.hasComponent_x\n", - "\n", - "\n", - "\n", - "Material_3->CrystalStructure_3\n", - "\n", - "\n", - "cmso.hasStructure\n", - "\n", - "\n", - "\n", - "Material_3->cmso.CrystallineMaterial\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "dc749d19-beff-4519-af88-00e8ccebf8ee\n", - "\n", - "Ni=0.75\n", - "\n", - "\n", - "\n", - "Material_3->dc749d19-beff-4519-af88-00e8ccebf8ee\n", - "\n", - "\n", - "cmso.hasElementRatio\n", - "\n", - "\n", - "\n", - "95db6d6e-57c5-47e4-bea1-ff05cc6516e7\n", - "\n", - "Al=0.25\n", - "\n", - "\n", - "\n", - "Material_3->95db6d6e-57c5-47e4-bea1-ff05cc6516e7\n", - "\n", - "\n", - "cmso.hasElementRatio\n", - "\n", - "\n", - "\n", - "Atom_2_5_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "ae81a551-baad-46b4-82f9-99d1ff6eaad6\n", - "\n", - "Si\n", - "\n", - "\n", - "\n", - "Atom_2_5_Element->ae81a551-baad-46b4-82f9-99d1ff6eaad6\n", - "\n", - "\n", - "cmso.hasSymbol\n", - "\n", - "\n", - "\n", - "Atom_2_0_Element\n", - "\n", - "Atom_2_0_Element\n", - "\n", - "\n", - "\n", - "Atom_2_0_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "e82e5fcc-9c51-4dd3-abc5-5b20e8ff4841\n", - "\n", - "Si\n", + "\n", + "\n", + "cmso.PositionVector->cmso.Vector\n", + "\n", + "\n", + "subClassOf\n", "\n", - "\n", - "\n", - "Atom_2_0_Element->e82e5fcc-9c51-4dd3-abc5-5b20e8ff4841\n", - "\n", - "\n", - "cmso.hasSymbol\n", + "\n", + "\n", + "sample_3_ChemicalSpecies->CHEBI.28112\n", + "\n", + "\n", + "cmso.hasElement\n", "\n", - "\n", - "\n", - "SimulationCell_3Angle->cmso.SimulationCellAngle\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_3_ChemicalSpecies->cmso.ChemicalSpecies\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "05a0276b-98af-4c8d-91c3-d3eca54f02b8\n", - "\n", - "90.0\n", + "\n", + "\n", + "sample_3_ChemicalSpecies->CHEBI.28984\n", + "\n", + "\n", + "cmso.hasElement\n", "\n", - "\n", - "\n", - "SimulationCell_3Angle->05a0276b-98af-4c8d-91c3-d3eca54f02b8\n", - "\n", - "\n", - "cmso.hasAngle_alpha\n", - "\n", - "\n", - "\n", - "e1d7fb8a-7517-4590-9a64-aabb6598dbae\n", - "\n", - "90.0\n", - "\n", - "\n", - "\n", - "SimulationCell_3Angle->e1d7fb8a-7517-4590-9a64-aabb6598dbae\n", - "\n", - "\n", - "cmso.hasAngle_gamma\n", - "\n", - "\n", - "\n", - "2f818731-deac-418f-9b42-4d37f1c8ec87\n", - "\n", - "90.0\n", - "\n", - "\n", - "\n", - "SimulationCell_3Angle->2f818731-deac-418f-9b42-4d37f1c8ec87\n", - "\n", - "\n", - "cmso.hasAngle_beta\n", - "\n", - "\n", - "\n", - "Material_2->cmso.CrystallineMaterial\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "Material_2->CrystalStructure_2\n", - "\n", - "\n", - "cmso.hasStructure\n", - "\n", - "\n", - "\n", - "cc2bcacd-cfd4-4338-83ba-3ef3dfe48cbd\n", - "\n", - "Si=1.0\n", + "\n", + "\n", + "sample_2_LatticeAngle->cmso.LatticeAngle\n", + "\n", + "\n", + "type\n", "\n", - "\n", - "\n", - "Material_2->cc2bcacd-cfd4-4338-83ba-3ef3dfe48cbd\n", - "\n", - "\n", - "cmso.hasElementRatio\n", + "\n", + "\n", + "424bd7ad-4413-4ff9-88e0-c9ddd9188e80\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector01->cmso.SimulationCellVector\n", - "\n", - "\n", - "type\n", + "\n", + "\n", + "sample_2_LatticeAngle->424bd7ad-4413-4ff9-88e0-c9ddd9188e80\n", + "\n", + "\n", + "cmso.hasAngle_gamma\n", "\n", - "\n", - "\n", - "ac266de7-4a16-49d5-be11-c8ac9442d4d4\n", - "\n", - "2.87\n", + "\n", + "\n", + "0b3ce741-fd81-456d-9c04-7af5ad612dd9\n", + "\n", + "90.0\n", "\n", - "\n", - "\n", - "SimulationCell_1Vector01->ac266de7-4a16-49d5-be11-c8ac9442d4d4\n", - "\n", - "\n", - "cmso.hasComponent_x\n", - "\n", - "\n", - "\n", - "1c7201fc-50db-4dcc-98ac-ed096dcd6cd5\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "SimulationCell_1Vector01->1c7201fc-50db-4dcc-98ac-ed096dcd6cd5\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "ae74d537-a1ce-406b-9ff8-a6cc1ac5b32c\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "SimulationCell_1Vector01->ae74d537-a1ce-406b-9ff8-a6cc1ac5b32c\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "Atom_2_3_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "724ad607-8c0d-4e11-aad7-6263a0e1e49a\n", - "\n", - "Si\n", - "\n", - "\n", - "\n", - "Atom_2_3_Element->724ad607-8c0d-4e11-aad7-6263a0e1e49a\n", - "\n", - "\n", - "cmso.hasSymbol\n", - "\n", - "\n", - "\n", - "Atom_2_2_Position->cmso.PositionVector\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "a434f04c-e4ed-4c2e-85fa-11ca3dc52df0\n", - "\n", - "2.715\n", + "\n", + "\n", + "sample_2_LatticeAngle->0b3ce741-fd81-456d-9c04-7af5ad612dd9\n", + "\n", + "\n", + "cmso.hasAngle_alpha\n", "\n", - "\n", - "\n", - "Atom_2_2_Position->a434f04c-e4ed-4c2e-85fa-11ca3dc52df0\n", - "\n", - "\n", - "cmso.hasComponent_x\n", - "\n", - "\n", - "\n", - "00dd7d1f-3431-4353-8084-3a1779ac0f49\n", - "\n", - "0.0\n", - "\n", - "\n", - "\n", - "Atom_2_2_Position->00dd7d1f-3431-4353-8084-3a1779ac0f49\n", - "\n", - "\n", - "cmso.hasComponent_z\n", - "\n", - "\n", - "\n", - "867897ed-d910-4ee2-9215-fcec2cdf1373\n", - "\n", - "2.715\n", - "\n", - "\n", - "\n", - "Atom_2_2_Position->867897ed-d910-4ee2-9215-fcec2cdf1373\n", - "\n", - "\n", - "cmso.hasComponent_y\n", - "\n", - "\n", - "\n", - "Atom_2_0->cmso.Atom\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "Atom_2_0->Atom_2_0_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", - "\n", - "\n", - "\n", - "Atom_2_0->Atom_2_0_Element\n", - "\n", - "\n", - "cmso.hasElement\n", - "\n", - "\n", - "\n", - "9747c17e-b2b7-4612-bce9-87f097d2eca9\n", - "\n", - "4\n", - "\n", - "\n", - "\n", - "Atom_2_0->9747c17e-b2b7-4612-bce9-87f097d2eca9\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", - "\n", - "\n", - "\n", - "Atom_2_7->Atom_2_7_Position\n", - "\n", - "\n", - "cmso.hasPositionVector\n", - "\n", - "\n", - "\n", - "Atom_2_7->cmso.Atom\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "Atom_2_7->Atom_2_7_Element\n", - "\n", - "\n", - "cmso.hasElement\n", - "\n", - "\n", - "\n", - "7bc18918-6a85-4916-bf0a-9854a8aa7eaf\n", - "\n", - "4\n", - "\n", - "\n", - "\n", - "Atom_2_7->7bc18918-6a85-4916-bf0a-9854a8aa7eaf\n", - "\n", - "\n", - "cmso.hasCoordinationNumber\n", - "\n", - "\n", - "\n", - "Atom_1_0_Element->cmso.Element\n", - "\n", - "\n", - "type\n", - "\n", - "\n", - "\n", - "ea8f9fba-9ce9-4cb7-ae04-0983dd6de59a\n", - "\n", - "Fe\n", - "\n", - "\n", - "\n", - "Atom_1_0_Element->ea8f9fba-9ce9-4cb7-ae04-0983dd6de59a\n", - "\n", - "\n", - "cmso.hasSymbol\n", + "\n", + "\n", + "a1749588-4368-4d6d-9917-55eb32deaa3f\n", + "\n", + "90.0\n", + "\n", + "\n", + "\n", + "sample_2_LatticeAngle->a1749588-4368-4d6d-9917-55eb32deaa3f\n", + "\n", + "\n", + "cmso.hasAngle_beta\n", "\n", "\n", "\n" ], "text/plain": [ - "" + "" ] }, "execution_count": 7, @@ -5155,7 +3884,7 @@ "
\n", " 0\n", " bcc\n", - " Sample_1\n", + " sample:1\n", "
\n", " \n", "\n", @@ -5163,7 +3892,7 @@ ], "text/plain": [ " hasAltNamevalue AtomicScaleSample\n", - "0 bcc Sample_1" + "0 bcc sample:1" ] }, "execution_count": 11, @@ -5187,7 +3916,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "efde861c-b9dd-4b97-861b-a330bbd95de0", "metadata": {}, "outputs": [], @@ -5205,7 +3934,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "0cb6b043-abb3-41ca-bee7-fb3bf1e7e615", "metadata": { "tags": [] @@ -5217,7 +3946,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "ae884716-a31b-4170-b4d4-9cf8309a6d74", "metadata": { "tags": [] @@ -5259,7 +3988,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "7ba5d551-f85b-4c33-be37-b997feffd7d7", "metadata": { "tags": [] @@ -5271,7 +4000,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "f4a90cbe-cf6a-4285-a0d2-b7525726c6dc", "metadata": { "tags": [] @@ -5283,7 +4012,7 @@ "Atoms(symbols='Fe2', pbc=True, cell=[2.87, 2.87, 2.87])" ] }, - "execution_count": 17, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -5291,6 +4020,14 @@ "source": [ "aseobj" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5ade0b7-c8dd-486a-b63d-9e819d457237", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/examples/02_grain_boundaries.ipynb b/examples/02_grain_boundaries.ipynb index eebce9f..5ea42fc 100644 --- a/examples/02_grain_boundaries.ipynb +++ b/examples/02_grain_boundaries.ipynb @@ -451,6 +451,26 @@ "y": 0.3684031499590902, "z": 1.164993050450134 }, + "camera": { + "center": { + "x": 0, + "y": 0, + "z": 0 + }, + "eye": { + "x": 1.5960473450294201, + "y": 1.59604734502942, + "z": 1.5960473450294201 + }, + "projection": { + "type": "perspective" + }, + "up": { + "x": 0, + "y": 0, + "z": 1 + } + }, "xaxis": { "showbackground": false, "showticklabels": false, @@ -1299,11 +1319,11 @@ "width": 700 } }, - "image/png": "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", + "image/png": "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", "text/html": [ - "