Hazard Evaluation¶
PHOENIX implements CHETAH-style hazard screening based on ASTM E659.
Screening Only
Hazard evaluation is for screening purposes only. Always validate results experimentally before handling potentially hazardous materials.
Quick Evaluation¶
from phoenix import Compound
compound = Compound.from_smiles("c1ccccc1[N+](=O)[O-]") # Nitrobenzene
result = compound.evaluate_hazard()
print(f"Hazard Class: {result.hazard_class}")
print(f"Triggered Criteria: {result.triggered_criteria}")
HazardResult¶
The evaluate_hazard() method returns a HazardResult dataclass:
Attributes¶
| Attribute | Type | Description |
|---|---|---|
smiles |
str | Canonical SMILES |
formula |
str | Molecular formula |
molecular_weight |
float | MW in g/mol |
delta_hf_kJ_mol |
float | ΔHf° in kJ/mol |
max_decomposition_kJ_mol |
float | ΔHd in kJ/mol |
max_decomposition_cal_g |
float | ΔHd in cal/g |
oxygen_balance_percent |
float | OB% |
hazard_class |
str | HIGH, MEDIUM, or LOW |
triggered_criteria |
tuple[int] | List of triggered criteria (1-4) |
functional_group_alerts |
tuple[str] | Names of detected groups |
product_breakdown |
dict | Decomposition products |
gas_volume_L_g |
float | Gas generation in L/g |
Example¶
result = compound.evaluate_hazard()
# Access all properties
print(f"Formula: {result.formula}")
print(f"MW: {result.molecular_weight:.2f} g/mol")
print(f"ΔHf°: {result.delta_hf_kJ_mol:.1f} kJ/mol")
print(f"ΔHd: {result.max_decomposition_cal_g:.1f} cal/g")
print(f"OB%: {result.oxygen_balance_percent:.1f}%")
print(f"Hazard Class: {result.hazard_class}")
print(f"Criteria: {result.triggered_criteria}")
print(f"Alerts: {result.functional_group_alerts}")
print(f"Gas: {result.gas_volume_L_g:.3f} L/g")
CHETAH Criteria¶
Criterion 1: High Instability¶
ΔHd < -300 cal/g
Compounds with very high decomposition energy.
# Example: Check for criterion 1
if result.max_decomposition_cal_g < -300:
print("HIGH hazard: Criterion 1 triggered")
Criterion 2: Medium Instability¶
-300 ≤ ΔHd < -100 cal/g
Compounds with moderate decomposition energy.
# Example: Check for criterion 2
if -300 <= result.max_decomposition_cal_g < -100:
print("MEDIUM hazard: Criterion 2 triggered")
Criterion 3: Oxygen Balance¶
-200% < OB% < +100%
Compounds with reactive oxygen balance.
# Example: Check for criterion 3
if -200 < result.oxygen_balance_percent < 100:
print("OB% in reactive range: Criterion 3 triggered")
Criterion 4: Functional Groups¶
Presence of known reactive functional groups.
# Example: Check for criterion 4
if result.functional_group_alerts:
print("Functional groups detected: Criterion 4 triggered")
for alert in result.functional_group_alerts:
print(f" - {alert}")
Hazard Classification Logic¶
IF Criterion 1 triggered:
→ HIGH
ELSE IF Criterion 2 triggered:
→ MEDIUM
ELSE IF Criteria 3 AND 4 triggered:
→ MEDIUM
ELSE IF ANY criterion triggered:
→ MEDIUM
ELSE:
→ LOW
Examples by Hazard Class¶
HIGH Hazard¶
# TNT - Trinitrotoluene
tnt = Compound.from_smiles("Cc1c([N+](=O)[O-])cc([N+](=O)[O-])cc1[N+](=O)[O-]")
result = tnt.evaluate_hazard()
print(f"TNT: {result.hazard_class}") # HIGH
print(f"ΔHd = {result.max_decomposition_cal_g:.0f} cal/g")
MEDIUM Hazard¶
# Nitrobenzene
nitrobenzene = Compound.from_smiles("c1ccccc1[N+](=O)[O-]")
result = nitrobenzene.evaluate_hazard()
print(f"Nitrobenzene: {result.hazard_class}") # MEDIUM
LOW Hazard¶
# Ethanol
ethanol = Compound.from_smiles("CCO")
result = ethanol.evaluate_hazard()
print(f"Ethanol: {result.hazard_class}") # LOW
Interpreting Results¶
High Hazard Compounds¶
- Immediate concern: High decomposition energy
- Handling: Extreme caution, specialized facilities
- Validation: Essential experimental characterization
Medium Hazard Compounds¶
- Potential concern: One or more criteria triggered
- Handling: Standard chemical safety procedures
- Validation: Recommended for new compounds
Low Hazard Compounds¶
- General chemicals: No CHETAH criteria triggered
- Handling: Normal laboratory safety
- Note: Still follow proper chemical safety
Decomposition Products¶
Access the predicted decomposition products:
result = compound.evaluate_hazard()
print("Decomposition products:")
for product, moles in result.product_breakdown.items():
if moles > 0.01:
print(f" {product}: {moles:.2f} mol")
Gas Generation¶
Predict gas generation from decomposition:
This is useful for:
- Containment requirements
- Pressure buildup assessment
- Ventilation planning
Working with Multiple Compounds¶
Manual Loop¶
smiles_list = [
"CCO", # Ethanol
"c1ccccc1[N+](=O)[O-]", # Nitrobenzene
"Cc1c([N+](=O)[O-])cc([N+](=O)[O-])cc1[N+](=O)[O-]", # TNT
]
for smiles in smiles_list:
compound = Compound.from_smiles(smiles)
result = compound.evaluate_hazard()
print(f"{result.formula}: {result.hazard_class}")
Using Batch Screening¶
For many compounds, use batch processing:
from phoenix import screen
results = screen(smiles_list)
df = results.dataframe
# Filter by hazard class
high_hazard = df[df['hazard_class'] == 'HIGH']
print(f"High hazard compounds: {len(high_hazard)}")
See Batch Processing for more details.
Integration with Other Analysis¶
Combining with Decomposition Analysis¶
compound = Compound.from_smiles("c1ccccc1[N+](=O)[O-]")
# Quick hazard check
result = compound.evaluate_hazard()
# Detailed decomposition analysis
if result.hazard_class != "LOW":
decomp = compound.max_decomposition(method="both")
print(f"Hierarchy: {decomp.hierarchy_result.delta_hd_cal_g:.1f} cal/g")
print(f"LP: {decomp.lp_result.delta_hd_cal_g:.1f} cal/g")
print(f"Deviation: {decomp.deviation_percent:.1f}%")
Functional Group Details¶
from phoenix.hazard.functional_groups import detect_functional_groups
compound = Compound.from_smiles("c1ccccc1[N+](=O)[O-]")
alerts = detect_functional_groups(compound)
for alert in alerts:
print(f"{alert.name} (x{alert.count})")
print(f" SMARTS: {alert.smarts}")
print(f" Risk: {alert.description}")
Best Practices¶
- Always validate experimentally for new or unfamiliar compounds
- Use batch screening for large datasets
- Check functional groups for specific hazard mechanisms
- Consider context - LOW doesn't mean "safe"
- Document results for safety reviews
Next Steps¶
- Decomposition: Detailed decomposition analysis
- Functional Groups: Reactive group detection
- Batch Processing: Screen multiple compounds