diff --git a/nomad/app/api/encyclopedia.py b/nomad/app/api/encyclopedia.py index 9a1b22bd897d47e013a34c4b2545599d1b5549a4..989ffb15c5f7a264884e185d6f962b6f5c726103 100644 --- a/nomad/app/api/encyclopedia.py +++ b/nomad/app/api/encyclopedia.py @@ -108,6 +108,11 @@ material_result = api.model("material_result", { "structure_prototype": fields.String, "structure_type": fields.String, }) +enc_filter = [ + Q("term", published=True), + Q("term", with_embargo=False), + Q("term", encyclopedia__staus="success"), +] @ns.route("/materials/<string:material_id>") @@ -135,14 +140,12 @@ class EncMaterialResource(Resource): # the same information. s = Search(index=config.elastic.index_name) - # Since we are looking for an exact match, we use filter context + # Since we are looking for an exact match, we use filtek context # together with term search for speed (instead of query context and # match search) query = Q( "bool", - filter=[ - Q("term", published=True), - Q("term", with_embargo=False), + filter=enc_filter + [ Q("term", encyclopedia__material__material_id=material_id), ] ) @@ -236,14 +239,10 @@ class EncMaterialsResource(Resource): except Exception as e: abort(400, message=str(e)) - filters = [] + filters = enc_filter must_nots = [] musts = [] - # Add term filters - filters.append(Q("term", published=True)) - filters.append(Q("term", with_embargo=False)) - def add_terms_filter(source, target, query_type="terms"): if data[source]: filters.append(Q(query_type, **{target: data[source]})) @@ -481,11 +480,7 @@ class EncGroupsResource(Resource): # variation hashes set. bool_query = Q( "bool", - filter=[ - Q("term", published=True), - Q("term", with_embargo=False), - Q("term", encyclopedia__material__material_id=material_id), - ], + filter=enc_filter + [Q("term", encyclopedia__material__material_id=material_id)], must=[ Q("exists", field="encyclopedia.properties.energies.energy_total"), Q("exists", field="encyclopedia.material.idealized_structure.cell_volume"), @@ -569,9 +564,7 @@ class EncGroupResource(Resource): bool_query = Q( "bool", - filter=[ - Q("term", published=True), - Q("term", with_embargo=False), + filter=enc_filter + [ Q("term", encyclopedia__material__material_id=material_id), Q("term", **{group_id_source: group_id}), ], @@ -654,10 +647,7 @@ class EncSuggestionsResource(Resource): s = Search(index=config.elastic.index_name) query = Q( "bool", - filter=[ - Q("term", published=True), - Q("term", with_embargo=False), - ] + filter=enc_filter ) s = s.query(query) s = s.extra(**{ @@ -730,9 +720,7 @@ class EncCalculationsResource(Resource): s = Search(index=config.elastic.index_name) query = Q( "bool", - filter=[ - Q("term", published=True), - Q("term", with_embargo=False), + filter=enc_filter + [ Q("term", encyclopedia__material__material_id=material_id), ] ) @@ -883,9 +871,7 @@ class EncStatisticsResource(Resource): # Find entries for the given material. bool_query = Q( "bool", - filter=[ - Q("term", published=True), - Q("term", with_embargo=False), + filter=enc_filter + [ Q("term", encyclopedia__material__material_id=material_id), Q("terms", calc_id=data["calculations"]), ] @@ -1081,9 +1067,7 @@ class EncCalculationResource(Resource): s = Search(index=config.elastic.index_name) query = Q( "bool", - filter=[ - Q("term", published=True), - Q("term", with_embargo=False), + filter=enc_filter + [ Q("term", encyclopedia__material__material_id=material_id), Q("term", calc_id=calc_id), ] diff --git a/nomad/datamodel/encyclopedia.py b/nomad/datamodel/encyclopedia.py index 8ca9fe918f39c7c90e1e1bd4fa094615f064462e..d3c8dc3eb7096260b434e704dd56a848567fe2ff 100644 --- a/nomad/datamodel/encyclopedia.py +++ b/nomad/datamodel/encyclopedia.py @@ -622,7 +622,7 @@ class EncyclopediaMetadata(MSection): properties = SubSection(sub_section=Properties.m_def, repeats=False, a_search='properties') calculation = SubSection(sub_section=Calculation.m_def, repeats=False, a_search='calculation') status = Quantity( - type=MEnum("success", "unsupported_material_type", "unsupported_calculation_type", "invalid_metainfo", "failure"), + type=MEnum("success", "unsupported_material_type", "unsupported_method_type", "unsupported_calculation_type", "invalid_metainfo", "failure"), description=""" The final Encyclopedia processing status for this entry. The meaning of the status is as follows: diff --git a/nomad/normalizing/encyclopedia/encyclopedia.py b/nomad/normalizing/encyclopedia/encyclopedia.py index 14ad0987ddba181a286eeae4a9e14b3e5ef87e28..1a7bc4ec1e977b7cbb7b94c072689e0cd6d07662 100644 --- a/nomad/normalizing/encyclopedia/encyclopedia.py +++ b/nomad/normalizing/encyclopedia/encyclopedia.py @@ -239,7 +239,7 @@ class EncyclopediaNormalizer(Normalizer): ) return - # Get the system type, stop if unknown + # Get the system type. material_enums = Material.material_type.type representative_system, material_type = self.material_type(material) if material_type != material_enums.bulk and material_type != material_enums.two_d and material_type != material_enums.one_d: @@ -250,11 +250,15 @@ class EncyclopediaNormalizer(Normalizer): enc_status=status, ) - return - - # Get the method type. For now, we allow unknown method type. - # Mostly to allow phonon calculations through. + # Get the method type representative_method, method_type = self.method_type(method) + if method_type == config.services.unavailable_value: + status = status_enums.unsupported_method_type + sec_enc.status = status + self.logger.info( + "unsupported method type for encyclopedia", + enc_status=status, + ) # Get representative scc try: diff --git a/nomad/processing/data.py b/nomad/processing/data.py index 265971248506603839525ef731a8f72a33c57d20..193d215dff33ee4d9edfb90bb3b80e50d598ef85 100644 --- a/nomad/processing/data.py +++ b/nomad/processing/data.py @@ -42,6 +42,9 @@ from nomad.parsing import parser_dict, match_parser, Backend from nomad.normalizing import normalizers from nomad.datamodel import EntryArchive from nomad.archive import query_archive +from nomad.datamodel.encyclopedia import ( + EncyclopediaMetadata, +) import phonopyparser @@ -440,7 +443,10 @@ class Calc(Proc): self._entry_metadata.dft.xc_functional = ref_archive.section_metadata.dft.xc_functional self._entry_metadata.dft.basis_set = ref_archive.section_metadata.dft.basis_set self._entry_metadata.dft.update_group_hash() - + except Exception as e: + logger.error("Could not retrieve method information for phonon calculation.", exception=e) + self._entry_metadata.encyclopedia.status = EncyclopediaMetadata.status.type.failure + finally: # persist the calc metadata with utils.timer(logger, 'saved calc metadata', step='metadata'): self.apply_entry_metadata(self._entry_metadata) @@ -457,9 +463,6 @@ class Calc(Proc): archive_size = self.write_archive(self._parser_backend) log_data.update(archive_size=archive_size) - except Exception as e: - logger.error("Could not retrieve method information for phonon calculation.", exception=e) - @contextmanager def use_parser_backend(self, processor_name): self._parser_backend.reset_status()