Substance Compliance

Query Definition

class SubstanceComplianceQuery

Evaluate compliance for Granta MI substance records against a number of indicators.

All methods used to add substances and indicators to this query return the query itself so that they can be chained together as required. Records can be added using a combination of any of the available methods.

Once the query is fully constructed, use the cxn. run() method to return a result of type SubstanceComplianceQueryResult.

Notes

The amount of a substance is a critical factor when determining if it is compliant or non-compliant with a legislation. For the other compliance queries in this API, the amount of substance is determined by the value set in the declaration stored in Granta MI. However, when performing a query for substance compliance, there is no declaration because the substances are being examined directly.

As a result, a set of extra methods are defined that allow the amount of each substance to be defined along with the reference to the record in Granta MI. These methods have the name _with_xxxxxx_and_amounts() and take a list of tuples as the argument.

Examples

>>> cxn = Connection("http://localhost/mi_servicelayer").with_autologon().connect()
>>> indicator = WatchListIndicator(
...     name="Prop 65",
...     legislation_names=["California Proposition 65 List"]
... )
>>> query = (
...     SubstanceComplianceQuery()
...     .with_cas_numbers_and_amounts([('50-00-0', 25), ('57-24-9', 0.5)])
...     .with_indicators([indicator])
... )
>>> cxn.run(query)
<SubstanceComplianceQueryResult: 2 SubstanceWithCompliance results>
with_indicators(indicators)

Add a list or set of WatchListIndicator or RoHSIndicator objects to evaluate compliance against.

Parameters
indicatorslist[WatchListIndicator | RoHSIndicator]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> indicator = WatchListIndicator(
...     name="Prop 65",
...     legislation_names=["California Proposition 65 List"]
... )
>>> MaterialComplianceQuery().with_indicators([indicator])
<MaterialCompliance: 0 materials, batch size = 100, 1 indicators>
with_cas_numbers_and_amounts(cas_numbers_and_amounts)

Add a list or set of CAS numbers and amounts to a substance query. The CAS numbers and quantity pairs are expressed as a tuple, with the quantity in units of wt. %.

Parameters
cas_numbers_and_amountslist[tuple[str, float]] | set[tuple[str, float]]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> query = SubstanceComplianceQuery()
>>> query = query.with_cas_numbers_and_amounts([('50-00-0', 25), ('57-24-9', 0.1)])
<SubstanceComplianceQuery: 2 substances, batch size = 500, 0 indicators>
with_ec_numbers_and_amounts(ec_numbers_and_amounts)

Add a list or set of EC numbers and amounts to a substance query. The EC numbers and quantity pairs are expressed as a tuple, with the quantity in units of wt. %.

Parameters
ec_numbers_and_amountslist[tuple[str, float]] | set[tuple[str, float]]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> query = SubstanceComplianceQuery()
>>> query = query.with_ec_numbers_and_amounts([('200-001-8', 25),
...                                            ('200-319-7', 0.1)])
<SubstanceComplianceQuery: 2 substances, batch size = 500, 0 indicators>
with_chemical_names_and_amounts(chemical_names_and_amounts)

Add a list or set of chemical names and amounts to a substance query. The chemical names and quantity pairs are expressed as a tuple, with the quantity in units of wt. %.

Parameters
chemical_names_and_amountslist[tuple[str, float]] | set[tuple[str, float]]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> query = SubstanceComplianceQuery()
>>> query = query.with_chemical_names_and_amounts([('Formaldehyde', 25),
...                                                ('Strychnine', 0.1)])
<SubstanceComplianceQuery: 2 substances, batch size = 500, 0 indicators>
with_cas_numbers(cas_numbers)

Add a list or set of CAS numbers to a substance query. The amount of substance in the material will be set to 100%.

Parameters
cas_numberslist[str] | set[str]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> query = SubstanceComplianceQuery().with_cas_numbers(['50-00-0', '57-24-9'])
<SubstanceComplianceQuery: 2 substances, batch size = 500, 0 indicators>
with_ec_numbers(ec_numbers)

Add a list or set of EC numbers to a substance query. The amount of substance in the material will be set to 100%.

Parameters
ec_numberslist[str] | set[str]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> query = SubstanceComplianceQuery().with_ec_numbers(['200-001-8', '200-319-7'])
<SubstanceComplianceQuery: 2 substances, batch size = 500, 0 indicators>
with_chemical_names(chemical_names)

Add a list or set of chemical names to a substance query. The amount of substance in the material will be set to 100%.

Parameters
chemical_nameslist[str] | set[str]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> query = SubstanceComplianceQuery().with_chemical_names(['Formaldehyde', 'Strychnine'])
<SubstanceComplianceQuery: 2 substances, batch size = 500, 0 indicators>
with_record_guids_and_amounts(record_guids_and_amounts)

Add a list or set of record GUIDs and amounts to a substance query. The GUID and quantity pairs are expressed as a tuple, with the quantity in units of wt. %.

Parameters
record_guids_and_amountslist[tuple[str, float]] | set[tuple[str, float]]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> query = SubstanceComplianceQuery()
>>> query = query.with_record_guids_and_amounts(
...     [('bdb0b880-e6ee-4f1a-bebd-af76959ae3c8', 25),
...      ('a98cf4b3-f96a-4714-9f79-afe443982c69', 0.1)]
... )
<SubstanceComplianceQuery: 2 substances, batch size = 500, 0 indicators>
with_record_history_guids_and_amounts(record_history_guids_and_amounts)

Add a list or set of record history GUID and amounts to a substance query. The GUID and quantity pairs are expressed as a tuple, with the quantity in units of wt. %.

Parameters
record_history_guids_and_amountslist[tuple[str, float]] | set[tuple[str, float]]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> query = SubstanceComplianceQuery()
>>> query = query.with_record_history_guids_and_amounts(
...     [('bdb0b880-e6ee-4f1a-bebd-af76959ae3c8', 25),
...      ('a98cf4b3-f96a-4714-9f79-afe443982c69', 0.1)]
... )
<SubstanceComplianceQuery: 2 substances, batch size = 500, 0 indicators>
with_record_history_ids_and_amounts(record_history_identities_and_amounts)

Add a list or set of record history identities and amounts to a substance query. The identity and quantity pairs are expressed as a tuple, with the quantity in units of wt. %.

Parameters
record_history_identities_and_amountslist[tuple[int, float]] | set[tuple[int, float]]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> query = SubstanceComplianceQuery()
>>> query = query.with_record_history_ids_and_amounts([(15321, 25), (17542, 0.1)])
<SubstanceComplianceQuery: 2 substances, batch size = 500, 0 indicators>
with_record_guids(record_guids)

Add a list or set of record GUIDs to a query.

Parameters
record_guidslist[str] | set[str]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> query = MaterialComplianceQuery()
>>> query = query.with_record_guids(['bdb0b880-e6ee-4f1a-bebd-af76959ae3c8',
>>>                                  'a98cf4b3-f96a-4714-9f79-afe443982c69'])
<MaterialCompliance: 2 materials, batch size = 100, 0 indicators>
with_record_history_guids(record_history_guids)

Add a list or set of record history GUIDs to a query.

Parameters
record_history_guidslist[str] | set[str]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> query = MaterialComplianceQuery()
>>> query.with_record_history_guids(['41e20a88-d496-4735-a177-6266fac9b4e2',
>>>                                  'd117d9ad-e6a9-4ba9-8ad8-9a20b6d0b5e2'])
<MaterialCompliance: 2 materials, batch size = 100, 0 indicators>
with_record_history_ids(record_history_identities)

Add a list or set of record history identities to a query.

Parameters
record_history_identitieslist[int] | set[int]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Examples

>>> MaterialComplianceQuery().with_record_history_ids([15321, 17542, 942])
<MaterialCompliance: 3 materials, batch size = 50, 0 indicators>
with_stk_records(stk_records)

Add a list of records generated by the Granta MI Scripting Toolkit for Python.

This should only be used with the corresponding method in the MI Scripting Toolkit that generates a dict of the appropriate shape. This method will be introduced in the next version of the MI Scripting Toolkit.

If the MI Scripting Toolkit method is not available, we recommend using the with_record_history_ids() method instead.

Parameters
stk_recordslist[dict[str, str]]
Returns
Query

Current query object.

Raises
TypeError

If the method is called with values that do not match the types described above.

Notes

Common scenarios in performing compliance would be to get the compliance status of all records with a certain attribute value or all records created in a certain period of time. These types of complex browsing and searching operations are provided by the MI Scripting Toolkit. A Python script would first use the MI Scripting Toolkit to find the records of interest and would then pass those record references into the BoM Analytics package.

This method is intended to streamline the communication between the Granta MI Scripting Toolkit and BoM Analytics packages.

Examples

>>> MaterialComplianceQuery().with_stk_records(stk_records)
<MaterialCompliance: 2 materials, batch size = 100, 0 indicators>
with_batch_size(batch_size)

Set the number of records to include in a single request for this query.

Default values are set based on typical usage of the Restricted Substances database. This value can be changed to optimize performance on a query-by-query basis if required. For example, you can change it if certain records contain particularly large or small numbers of associated records.

Parameters
batch_sizeint

Number of records to include in a single request to Granta MI.

Returns
Query

Current query object.

Raises
ValueError

If the batch size is set to a number less than 1.

TypeError

If a value of any type other than int is specified.

Notes

The Restricted Substances database makes extensive use of tabular data and associated records to store the complex hierarchical relationships that define compliance of products, assemblies, parts, specifications, and materials. As a result, it is impossible to determine the complexity of a particular query without knowing precisely how many records are related to the record included in the query.

The default batch sizes are set for each record type and represent appropriate numbers of those records to be included in the same request assuming typical numbers of associated records.

Even if the records are queried in multiple batches, the results will be assembled into a single result object.

Examples

>>> MaterialComplianceQuery().with_batch_size(50)
<MaterialCompliance: 0 materials, batch size = 50, 0 indicators>

Query Result

class SubstanceComplianceQueryResult(results, indicator_definitions, messages)

Retrieves the result of running the SubstanceComplianceQuery class. This class describes the compliance status of substances against one or more indicators.

Notes

Objects of this class are only returned as the result of a query. The class is not intended to be instantiated directly.

compliance_by_indicator

Compliance status for each indicator in the original query. The indicator name is used as the dictionary key.

The result for each indicator is determined by taking the worst result for that indicator across all items included in the query.

Returns
dict[str, WatchListIndicator | RoHSIndicator]

Examples

>>> compliance_result: MaterialComplianceQueryResult
>>> compliance_result.compliance_by_indicator
{'Prop 65': <WatchListIndicator,
        name: Prop 65,
        flag: WatchListFlag.WatchListAboveThreshold>
}
compliance_by_substance_and_indicator

Compliance status for each substance specified in the original query.

Returns
list[SubstanceWithComplianceResult]

Examples

>>> result: SubstanceComplianceQueryResult
>>> result.compliance_by_substance_and_indicator
[<SubstanceWithComplianceResult({"cas_number": 50-00-0}), 1 indicators>, ...]
messages

Messages generated by Granta MI when running the query. The presence of one or more messages means that something unexpected happened when running the query but that the query could still be completed.

Messages are sorted in order of decreasing severity and are available in the Service Layer log file.

Messages are also logged using the Python logging module to the ansys.grantami.bomanalytics logger. By default, messages with a severity of warning or higher are printed on stderr.

Returns
list[LogMessage]

Examples

>>> result: MaterialImpactedSubstancesQueryResult
>>> result.messages
[LogMessage(severity='warning', message='Material "ABS+PVC (flame retarded)" has
    2 substance row(s) with missing substance links.')]

Substance Result

class SubstanceWithComplianceResult(indicator_results, indicator_definitions, **kwargs)

Retrieves an individual substance included as part of a compliance query result. This object includes two categories of attributes:

  • The reference to the substance in Granta MI

  • The compliance status of this substance, stored in a dictionary of one or more indicator objects

Notes

The record reference attributes below are only populated if they were specified in the original query.

Objects of this class are only returned as the result of a query. The class is not intended to be instantiated directly.

Attributes
record_history_identityint, optional
cas_numberstr, optional
ec_numberstr, optional
chemical_namestr, optional
record_history_guidstr, optional
record_guidstr, optional
indicatorsdict[str, WatchListIndicator | RoHSIndicator]

Compliance status of this item for each indicator included in the original query.