molbuilder 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. molbuilder/__init__.py +8 -0
  2. molbuilder/__main__.py +6 -0
  3. molbuilder/atomic/__init__.py +4 -0
  4. molbuilder/atomic/bohr.py +235 -0
  5. molbuilder/atomic/quantum_atom.py +334 -0
  6. molbuilder/atomic/quantum_numbers.py +196 -0
  7. molbuilder/atomic/wavefunctions.py +297 -0
  8. molbuilder/bonding/__init__.py +4 -0
  9. molbuilder/bonding/covalent.py +442 -0
  10. molbuilder/bonding/lewis.py +347 -0
  11. molbuilder/bonding/vsepr.py +433 -0
  12. molbuilder/cli/__init__.py +1 -0
  13. molbuilder/cli/demos.py +516 -0
  14. molbuilder/cli/menu.py +127 -0
  15. molbuilder/cli/wizard.py +831 -0
  16. molbuilder/core/__init__.py +6 -0
  17. molbuilder/core/bond_data.py +170 -0
  18. molbuilder/core/constants.py +51 -0
  19. molbuilder/core/element_properties.py +183 -0
  20. molbuilder/core/elements.py +181 -0
  21. molbuilder/core/geometry.py +232 -0
  22. molbuilder/gui/__init__.py +2 -0
  23. molbuilder/gui/app.py +286 -0
  24. molbuilder/gui/canvas3d.py +115 -0
  25. molbuilder/gui/dialogs.py +117 -0
  26. molbuilder/gui/event_handler.py +118 -0
  27. molbuilder/gui/sidebar.py +105 -0
  28. molbuilder/gui/toolbar.py +71 -0
  29. molbuilder/io/__init__.py +1 -0
  30. molbuilder/io/json_io.py +146 -0
  31. molbuilder/io/mol_sdf.py +169 -0
  32. molbuilder/io/pdb.py +184 -0
  33. molbuilder/io/smiles_io.py +47 -0
  34. molbuilder/io/xyz.py +103 -0
  35. molbuilder/molecule/__init__.py +2 -0
  36. molbuilder/molecule/amino_acids.py +919 -0
  37. molbuilder/molecule/builders.py +257 -0
  38. molbuilder/molecule/conformations.py +70 -0
  39. molbuilder/molecule/functional_groups.py +484 -0
  40. molbuilder/molecule/graph.py +712 -0
  41. molbuilder/molecule/peptides.py +13 -0
  42. molbuilder/molecule/stereochemistry.py +6 -0
  43. molbuilder/process/__init__.py +3 -0
  44. molbuilder/process/conditions.py +260 -0
  45. molbuilder/process/costing.py +316 -0
  46. molbuilder/process/purification.py +285 -0
  47. molbuilder/process/reactor.py +297 -0
  48. molbuilder/process/safety.py +476 -0
  49. molbuilder/process/scale_up.py +427 -0
  50. molbuilder/process/solvent_systems.py +204 -0
  51. molbuilder/reactions/__init__.py +3 -0
  52. molbuilder/reactions/functional_group_detect.py +728 -0
  53. molbuilder/reactions/knowledge_base.py +1716 -0
  54. molbuilder/reactions/reaction_types.py +102 -0
  55. molbuilder/reactions/reagent_data.py +1248 -0
  56. molbuilder/reactions/retrosynthesis.py +1430 -0
  57. molbuilder/reactions/synthesis_route.py +377 -0
  58. molbuilder/reports/__init__.py +158 -0
  59. molbuilder/reports/cost_report.py +206 -0
  60. molbuilder/reports/molecule_report.py +279 -0
  61. molbuilder/reports/safety_report.py +296 -0
  62. molbuilder/reports/synthesis_report.py +283 -0
  63. molbuilder/reports/text_formatter.py +170 -0
  64. molbuilder/smiles/__init__.py +4 -0
  65. molbuilder/smiles/parser.py +487 -0
  66. molbuilder/smiles/tokenizer.py +291 -0
  67. molbuilder/smiles/writer.py +375 -0
  68. molbuilder/visualization/__init__.py +1 -0
  69. molbuilder/visualization/bohr_viz.py +166 -0
  70. molbuilder/visualization/molecule_viz.py +368 -0
  71. molbuilder/visualization/quantum_viz.py +434 -0
  72. molbuilder/visualization/theme.py +12 -0
  73. molbuilder-1.0.0.dist-info/METADATA +360 -0
  74. molbuilder-1.0.0.dist-info/RECORD +78 -0
  75. molbuilder-1.0.0.dist-info/WHEEL +5 -0
  76. molbuilder-1.0.0.dist-info/entry_points.txt +2 -0
  77. molbuilder-1.0.0.dist-info/licenses/LICENSE +21 -0
  78. molbuilder-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1248 @@
1
+ """Reagent and solvent databases with GHS hazard information.
2
+
3
+ This module provides two master dictionaries -- ``REAGENT_DB`` and
4
+ ``SOLVENT_DB`` -- that catalogue the most common reagents and solvents
5
+ encountered in organic synthesis. Each entry carries physical-property
6
+ data, approximate cost, GHS hazard classifications, and storage guidance.
7
+
8
+ Lookup helpers (``get_reagent``, ``get_solvent``, ``search_reagents``,
9
+ ``search_solvents``) allow fuzzy retrieval by name or formula fragment.
10
+ """
11
+
12
+ from __future__ import annotations
13
+ from dataclasses import dataclass, field
14
+
15
+
16
+ # =====================================================================
17
+ # Reagent name normalisation
18
+ # =====================================================================
19
+
20
+ # Alias dictionary for common alternative names
21
+ _REAGENT_ALIASES: dict[str, str] = {
22
+ "lialh4": "lithium_aluminium_hydride",
23
+ "nabh4": "sodium_borohydride",
24
+ "pcc": "pyridinium_chlorochromate",
25
+ "dcc": "dicyclohexylcarbodiimide",
26
+ "mcpba": "meta_chloroperoxybenzoic_acid",
27
+ "tbscl": "tert_butyldimethylsilyl_chloride",
28
+ "tmscl": "trimethylsilyl_chloride",
29
+ "boc2o": "di_tert_butyl_dicarbonate",
30
+ "fmoc_cl": "fluorenylmethyloxycarbonyl_chloride",
31
+ "pd_c": "palladium_on_carbon",
32
+ "pd/c": "palladium_on_carbon",
33
+ "h2so4": "sulfuric_acid",
34
+ "hcl": "hydrochloric_acid",
35
+ "naoh": "sodium_hydroxide",
36
+ "koh": "potassium_hydroxide",
37
+ "kmno4": "potassium_permanganate",
38
+ "k2cr2o7": "potassium_dichromate",
39
+ "lioh": "lithium_hydroxide",
40
+ "nah": "sodium_hydride",
41
+ "n_buli": "n_butyllithium",
42
+ "n-buli": "n_butyllithium",
43
+ "t_buok": "potassium_tert_butoxide",
44
+ "t-buok": "potassium_tert_butoxide",
45
+ "et3n": "triethylamine",
46
+ "dbu": "1_8_diazabicyclo_5_4_0_undec_7_ene",
47
+ "dmap": "4_dimethylaminopyridine",
48
+ "tfa": "trifluoroacetic_acid",
49
+ }
50
+
51
+
52
+ def normalize_reagent_name(name: str) -> str:
53
+ """Normalize a reagent name to its canonical key.
54
+
55
+ Lowercases, replaces whitespace/hyphens with underscores, and checks
56
+ the alias dictionary for common abbreviations.
57
+ """
58
+ key = name.strip().lower().replace(" ", "_").replace("-", "_")
59
+ return _REAGENT_ALIASES.get(key, key)
60
+
61
+
62
+ # =====================================================================
63
+ # Data classes
64
+ # =====================================================================
65
+
66
+ @dataclass
67
+ class Reagent:
68
+ name: str
69
+ formula: str
70
+ cas: str = ""
71
+ mw: float = 0.0
72
+ cost_per_kg: float = 0.0 # USD approximate
73
+ ghs_hazards: list[str] = field(default_factory=list)
74
+ ghs_pictograms: list[str] = field(default_factory=list)
75
+ storage: str = ""
76
+ physical_state: str = "" # solid, liquid, gas
77
+
78
+
79
+ @dataclass
80
+ class Solvent:
81
+ name: str
82
+ formula: str
83
+ bp: float = 0.0 # boiling point degC
84
+ mp: float = 0.0 # melting point degC
85
+ density: float = 1.0 # g/mL
86
+ dielectric: float = 1.0
87
+ polarity_index: float = 0.0
88
+ cas: str = ""
89
+ cost_per_L: float = 0.0
90
+ green_score: int = 5 # 1=very green, 10=avoid
91
+ ghs_hazards: list[str] = field(default_factory=list)
92
+ miscible_with_water: bool = False
93
+
94
+
95
+ # =====================================================================
96
+ # REAGENT_DB (~100 entries)
97
+ # =====================================================================
98
+
99
+ REAGENT_DB: dict[str, Reagent] = {
100
+
101
+ # -----------------------------------------------------------------
102
+ # Oxidizing agents
103
+ # -----------------------------------------------------------------
104
+ "kmno4": Reagent(
105
+ name="Potassium permanganate", formula="KMnO4", cas="7722-64-7",
106
+ mw=158.03, cost_per_kg=35,
107
+ ghs_hazards=["H272", "H302", "H314", "H410"],
108
+ ghs_pictograms=["GHS03", "GHS05", "GHS07", "GHS09"],
109
+ storage="Cool dry place, away from organics", physical_state="solid",
110
+ ),
111
+ "cro3": Reagent(
112
+ name="Chromium trioxide", formula="CrO3", cas="1333-82-0",
113
+ mw=99.99, cost_per_kg=120,
114
+ ghs_hazards=["H271", "H301", "H311", "H314", "H317", "H330", "H340", "H350", "H361", "H372", "H410"],
115
+ ghs_pictograms=["GHS03", "GHS05", "GHS06", "GHS08", "GHS09"],
116
+ storage="Locked oxidizer cabinet, separate from organics", physical_state="solid",
117
+ ),
118
+ "pcc": Reagent(
119
+ name="Pyridinium chlorochromate", formula="C5H5NHCrO3Cl", cas="26299-14-9",
120
+ mw=215.56, cost_per_kg=280,
121
+ ghs_hazards=["H301", "H312", "H314", "H317", "H340", "H350"],
122
+ ghs_pictograms=["GHS05", "GHS06", "GHS08"],
123
+ storage="Desiccator, away from organics", physical_state="solid",
124
+ ),
125
+ "pdc": Reagent(
126
+ name="Pyridinium dichromate", formula="(C5H5NH)2Cr2O7", cas="20039-37-6",
127
+ mw=376.21, cost_per_kg=350,
128
+ ghs_hazards=["H301", "H312", "H314", "H317", "H340", "H350"],
129
+ ghs_pictograms=["GHS05", "GHS06", "GHS08"],
130
+ storage="Desiccator, away from organics", physical_state="solid",
131
+ ),
132
+ "oxalyl_chloride": Reagent(
133
+ name="Oxalyl chloride", formula="(COCl)2", cas="79-37-8",
134
+ mw=126.93, cost_per_kg=75,
135
+ ghs_hazards=["H301", "H314", "H330"],
136
+ ghs_pictograms=["GHS05", "GHS06"],
137
+ storage="Fridge under inert gas, moisture-sensitive", physical_state="liquid",
138
+ ),
139
+ "dmso": Reagent(
140
+ name="Dimethyl sulfoxide", formula="(CH3)2SO", cas="67-68-5",
141
+ mw=78.13, cost_per_kg=15,
142
+ ghs_hazards=[],
143
+ ghs_pictograms=[],
144
+ storage="Room temperature, tightly sealed", physical_state="liquid",
145
+ ),
146
+ "jones_reagent": Reagent(
147
+ name="Jones reagent (CrO3/H2SO4)", formula="CrO3/H2SO4",
148
+ mw=0.0, cost_per_kg=0,
149
+ ghs_hazards=["H271", "H301", "H314", "H340", "H350"],
150
+ ghs_pictograms=["GHS03", "GHS05", "GHS06", "GHS08"],
151
+ storage="Prepared fresh in acetone", physical_state="liquid",
152
+ ),
153
+ "mcpba": Reagent(
154
+ name="meta-Chloroperoxybenzoic acid", formula="ClC6H4CO3H", cas="937-14-4",
155
+ mw=172.57, cost_per_kg=220,
156
+ ghs_hazards=["H242", "H302", "H315", "H318", "H335"],
157
+ ghs_pictograms=["GHS02", "GHS05", "GHS07"],
158
+ storage="Freezer, away from organics and metals", physical_state="solid",
159
+ ),
160
+ "oso4": Reagent(
161
+ name="Osmium tetroxide", formula="OsO4", cas="20816-12-0",
162
+ mw=254.23, cost_per_kg=25000,
163
+ ghs_hazards=["H300", "H310", "H314", "H330"],
164
+ ghs_pictograms=["GHS05", "GHS06"],
165
+ storage="Double-sealed container, fume hood only", physical_state="solid",
166
+ ),
167
+ "naio4": Reagent(
168
+ name="Sodium periodate", formula="NaIO4", cas="7790-28-5",
169
+ mw=213.89, cost_per_kg=110,
170
+ ghs_hazards=["H272", "H302", "H315", "H319"],
171
+ ghs_pictograms=["GHS03", "GHS07"],
172
+ storage="Cool dry place", physical_state="solid",
173
+ ),
174
+ "h2o2": Reagent(
175
+ name="Hydrogen peroxide 30%", formula="H2O2", cas="7722-84-1",
176
+ mw=34.01, cost_per_kg=12,
177
+ ghs_hazards=["H271", "H302", "H314", "H318", "H335"],
178
+ ghs_pictograms=["GHS03", "GHS05", "GHS07"],
179
+ storage="Fridge, away from metals and organics", physical_state="liquid",
180
+ ),
181
+ "naocl": Reagent(
182
+ name="Sodium hypochlorite (bleach)", formula="NaOCl", cas="7681-52-9",
183
+ mw=74.44, cost_per_kg=5,
184
+ ghs_hazards=["H314", "H400", "H410"],
185
+ ghs_pictograms=["GHS05", "GHS09"],
186
+ storage="Cool dark place", physical_state="liquid",
187
+ ),
188
+ "dess_martin": Reagent(
189
+ name="Dess-Martin periodinane", formula="C13H13IO8", cas="87413-09-0",
190
+ mw=424.14, cost_per_kg=3500,
191
+ ghs_hazards=["H228", "H302", "H315", "H319"],
192
+ ghs_pictograms=["GHS02", "GHS07"],
193
+ storage="Freezer, moisture-sensitive", physical_state="solid",
194
+ ),
195
+
196
+ # -----------------------------------------------------------------
197
+ # Reducing agents
198
+ # -----------------------------------------------------------------
199
+ "nabh4": Reagent(
200
+ name="Sodium borohydride", formula="NaBH4", cas="16940-66-2",
201
+ mw=37.83, cost_per_kg=80,
202
+ ghs_hazards=["H260", "H301", "H314"],
203
+ ghs_pictograms=["GHS02", "GHS05", "GHS06"],
204
+ storage="Dry, inert atmosphere, away from water", physical_state="solid",
205
+ ),
206
+ "lialh4": Reagent(
207
+ name="Lithium aluminium hydride", formula="LiAlH4", cas="16853-85-3",
208
+ mw=37.95, cost_per_kg=250,
209
+ ghs_hazards=["H260", "H314"],
210
+ ghs_pictograms=["GHS02", "GHS05"],
211
+ storage="Glovebox or sure-seal, strict inert atmosphere", physical_state="solid",
212
+ ),
213
+ "dibal_h": Reagent(
214
+ name="Diisobutylaluminium hydride", formula="(i-Bu)2AlH", cas="1191-15-7",
215
+ mw=142.22, cost_per_kg=320,
216
+ ghs_hazards=["H250", "H260", "H314"],
217
+ ghs_pictograms=["GHS02", "GHS05"],
218
+ storage="Sure-seal, strict inert atmosphere, -20 C", physical_state="liquid",
219
+ ),
220
+ "h2_pd_c": Reagent(
221
+ name="Hydrogen / Palladium on carbon", formula="H2 + Pd/C",
222
+ mw=0.0, cost_per_kg=800,
223
+ ghs_hazards=["H220", "H315", "H319", "H335"],
224
+ ghs_pictograms=["GHS02", "GHS07"],
225
+ storage="Pd/C: keep wet to avoid pyrophoricity; H2: gas cylinder", physical_state="solid",
226
+ ),
227
+ "zn_hcl": Reagent(
228
+ name="Zinc / Hydrochloric acid", formula="Zn/HCl",
229
+ mw=0.0, cost_per_kg=15,
230
+ ghs_hazards=["H290", "H314", "H335", "H410"],
231
+ ghs_pictograms=["GHS05", "GHS07", "GHS09"],
232
+ storage="Zinc: dry; HCl: corrosive cabinet", physical_state="solid",
233
+ ),
234
+ "na_nh3": Reagent(
235
+ name="Sodium in liquid ammonia (Birch)", formula="Na/NH3(l)",
236
+ mw=0.0, cost_per_kg=50,
237
+ ghs_hazards=["H250", "H260", "H314", "H331"],
238
+ ghs_pictograms=["GHS02", "GHS05", "GHS06"],
239
+ storage="Na under oil; NH3 in cylinder", physical_state="liquid",
240
+ ),
241
+ "red_al": Reagent(
242
+ name="Red-Al (sodium bis(2-methoxyethoxy)aluminium hydride)",
243
+ formula="NaAlH2(OCH2CH2OCH3)2", cas="22722-98-1",
244
+ mw=202.16, cost_per_kg=400,
245
+ ghs_hazards=["H250", "H260", "H314"],
246
+ ghs_pictograms=["GHS02", "GHS05"],
247
+ storage="Sure-seal, inert atmosphere", physical_state="liquid",
248
+ ),
249
+ "cecl3": Reagent(
250
+ name="Cerium(III) chloride heptahydrate", formula="CeCl3*7H2O", cas="18618-55-8",
251
+ mw=372.58, cost_per_kg=90,
252
+ ghs_hazards=["H302", "H315", "H319"],
253
+ ghs_pictograms=["GHS07"],
254
+ storage="Cool dry place", physical_state="solid",
255
+ ),
256
+
257
+ # -----------------------------------------------------------------
258
+ # Nucleophiles / Bases (inorganic)
259
+ # -----------------------------------------------------------------
260
+ "naoh": Reagent(
261
+ name="Sodium hydroxide", formula="NaOH", cas="1310-73-2",
262
+ mw=40.00, cost_per_kg=8,
263
+ ghs_hazards=["H290", "H314"],
264
+ ghs_pictograms=["GHS05"],
265
+ storage="Tightly sealed, away from acids", physical_state="solid",
266
+ ),
267
+ "koh": Reagent(
268
+ name="Potassium hydroxide", formula="KOH", cas="1310-58-3",
269
+ mw=56.11, cost_per_kg=12,
270
+ ghs_hazards=["H290", "H302", "H314"],
271
+ ghs_pictograms=["GHS05", "GHS07"],
272
+ storage="Tightly sealed, away from acids", physical_state="solid",
273
+ ),
274
+ "nacn": Reagent(
275
+ name="Sodium cyanide", formula="NaCN", cas="143-33-9",
276
+ mw=49.01, cost_per_kg=60,
277
+ ghs_hazards=["H290", "H300", "H310", "H330", "H410"],
278
+ ghs_pictograms=["GHS06", "GHS09"],
279
+ storage="Locked poison cabinet, separate from acids", physical_state="solid",
280
+ ),
281
+ "nan3": Reagent(
282
+ name="Sodium azide", formula="NaN3", cas="26628-22-8",
283
+ mw=65.01, cost_per_kg=55,
284
+ ghs_hazards=["H300", "H310", "H400", "H410"],
285
+ ghs_pictograms=["GHS06", "GHS09"],
286
+ storage="Poison cabinet, never contact heavy metals or acid", physical_state="solid",
287
+ ),
288
+ "naome": Reagent(
289
+ name="Sodium methoxide", formula="NaOCH3", cas="124-41-4",
290
+ mw=54.02, cost_per_kg=40,
291
+ ghs_hazards=["H228", "H251", "H301", "H311", "H314", "H331"],
292
+ ghs_pictograms=["GHS02", "GHS05", "GHS06"],
293
+ storage="Inert atmosphere, away from moisture", physical_state="solid",
294
+ ),
295
+ "naoet": Reagent(
296
+ name="Sodium ethoxide", formula="NaOC2H5", cas="141-52-6",
297
+ mw=68.05, cost_per_kg=45,
298
+ ghs_hazards=["H228", "H251", "H301", "H311", "H314", "H331"],
299
+ ghs_pictograms=["GHS02", "GHS05", "GHS06"],
300
+ storage="Inert atmosphere, away from moisture", physical_state="solid",
301
+ ),
302
+ "kotbu": Reagent(
303
+ name="Potassium tert-butoxide", formula="KOC(CH3)3", cas="865-47-4",
304
+ mw=112.21, cost_per_kg=90,
305
+ ghs_hazards=["H228", "H251", "H301", "H314"],
306
+ ghs_pictograms=["GHS02", "GHS05", "GHS06"],
307
+ storage="Glovebox or inert atmosphere", physical_state="solid",
308
+ ),
309
+
310
+ # -----------------------------------------------------------------
311
+ # Electrophiles (alkyl/acyl halides)
312
+ # -----------------------------------------------------------------
313
+ "mei": Reagent(
314
+ name="Methyl iodide", formula="CH3I", cas="74-88-4",
315
+ mw=141.94, cost_per_kg=120,
316
+ ghs_hazards=["H301", "H312", "H315", "H331", "H335", "H351"],
317
+ ghs_pictograms=["GHS06", "GHS08"],
318
+ storage="Fridge, amber bottle, inert atmosphere", physical_state="liquid",
319
+ ),
320
+ "etbr": Reagent(
321
+ name="Ethyl bromide", formula="C2H5Br", cas="74-96-4",
322
+ mw=108.97, cost_per_kg=60,
323
+ ghs_hazards=["H225", "H302", "H332", "H351"],
324
+ ghs_pictograms=["GHS02", "GHS07", "GHS08"],
325
+ storage="Fridge, away from ignition", physical_state="liquid",
326
+ ),
327
+ "bnbr": Reagent(
328
+ name="Benzyl bromide", formula="C6H5CH2Br", cas="100-39-0",
329
+ mw=171.04, cost_per_kg=90,
330
+ ghs_hazards=["H301", "H315", "H318", "H335"],
331
+ ghs_pictograms=["GHS05", "GHS06"],
332
+ storage="Fridge, tightly sealed", physical_state="liquid",
333
+ ),
334
+ "allyl_bromide": Reagent(
335
+ name="Allyl bromide", formula="CH2=CHCH2Br", cas="106-95-6",
336
+ mw=120.98, cost_per_kg=55,
337
+ ghs_hazards=["H225", "H301", "H311", "H314", "H331"],
338
+ ghs_pictograms=["GHS02", "GHS05", "GHS06"],
339
+ storage="Fridge, inert atmosphere", physical_state="liquid",
340
+ ),
341
+ "accl": Reagent(
342
+ name="Acetyl chloride", formula="CH3COCl", cas="75-36-5",
343
+ mw=78.50, cost_per_kg=30,
344
+ ghs_hazards=["H225", "H314", "H331"],
345
+ ghs_pictograms=["GHS02", "GHS05", "GHS06"],
346
+ storage="Inert atmosphere, moisture-sensitive", physical_state="liquid",
347
+ ),
348
+ "bzcl": Reagent(
349
+ name="Benzoyl chloride", formula="C6H5COCl", cas="98-88-4",
350
+ mw=140.57, cost_per_kg=40,
351
+ ghs_hazards=["H302", "H314", "H332"],
352
+ ghs_pictograms=["GHS05", "GHS07"],
353
+ storage="Inert atmosphere, moisture-sensitive", physical_state="liquid",
354
+ ),
355
+
356
+ # -----------------------------------------------------------------
357
+ # Organometallics
358
+ # -----------------------------------------------------------------
359
+ "memgbr": Reagent(
360
+ name="Methylmagnesium bromide (3 M in Et2O)", formula="CH3MgBr",
361
+ cas="75-16-1", mw=119.24, cost_per_kg=600,
362
+ ghs_hazards=["H225", "H250", "H260", "H314"],
363
+ ghs_pictograms=["GHS02", "GHS05"],
364
+ storage="Sure-seal, strict inert atmosphere, fridge", physical_state="liquid",
365
+ ),
366
+ "etmgbr": Reagent(
367
+ name="Ethylmagnesium bromide (3 M in Et2O)", formula="C2H5MgBr",
368
+ cas="925-90-6", mw=133.27, cost_per_kg=550,
369
+ ghs_hazards=["H225", "H250", "H260", "H314"],
370
+ ghs_pictograms=["GHS02", "GHS05"],
371
+ storage="Sure-seal, strict inert atmosphere, fridge", physical_state="liquid",
372
+ ),
373
+ "phmgbr": Reagent(
374
+ name="Phenylmagnesium bromide (3 M in THF)", formula="C6H5MgBr",
375
+ cas="100-58-3", mw=181.31, cost_per_kg=500,
376
+ ghs_hazards=["H225", "H250", "H260", "H314"],
377
+ ghs_pictograms=["GHS02", "GHS05"],
378
+ storage="Sure-seal, strict inert atmosphere, fridge", physical_state="liquid",
379
+ ),
380
+ "n_buli": Reagent(
381
+ name="n-Butyllithium (2.5 M in hexanes)", formula="C4H9Li",
382
+ cas="109-72-8", mw=64.06, cost_per_kg=450,
383
+ ghs_hazards=["H225", "H250", "H260", "H304", "H314"],
384
+ ghs_pictograms=["GHS02", "GHS05"],
385
+ storage="Sure-seal, glovebox, -20 C", physical_state="liquid",
386
+ ),
387
+ "phli": Reagent(
388
+ name="Phenyllithium (1.9 M in Bu2O)", formula="C6H5Li",
389
+ cas="591-51-5", mw=84.04, cost_per_kg=700,
390
+ ghs_hazards=["H225", "H250", "H260", "H314"],
391
+ ghs_pictograms=["GHS02", "GHS05"],
392
+ storage="Sure-seal, glovebox", physical_state="liquid",
393
+ ),
394
+ "meli": Reagent(
395
+ name="Methyllithium (1.6 M in Et2O)", formula="CH3Li",
396
+ cas="917-54-4", mw=21.98, cost_per_kg=800,
397
+ ghs_hazards=["H225", "H250", "H260", "H314"],
398
+ ghs_pictograms=["GHS02", "GHS05"],
399
+ storage="Sure-seal, glovebox", physical_state="liquid",
400
+ ),
401
+
402
+ # -----------------------------------------------------------------
403
+ # Coupling catalysts / reagents
404
+ # -----------------------------------------------------------------
405
+ "pd_pph3_4": Reagent(
406
+ name="Tetrakis(triphenylphosphine)palladium(0)", formula="Pd(PPh3)4",
407
+ cas="14221-01-3", mw=1155.56, cost_per_kg=12000,
408
+ ghs_hazards=["H315", "H319", "H335"],
409
+ ghs_pictograms=["GHS07"],
410
+ storage="Glovebox or Schlenk line, -20 C, light-sensitive", physical_state="solid",
411
+ ),
412
+ "pdcl2_dppf": Reagent(
413
+ name="[1,1'-Bis(diphenylphosphino)ferrocene]dichloropalladium(II)",
414
+ formula="PdCl2(dppf)", cas="72287-26-4", mw=731.70, cost_per_kg=15000,
415
+ ghs_hazards=["H302", "H315", "H319", "H335"],
416
+ ghs_pictograms=["GHS07"],
417
+ storage="Inert atmosphere, light-sensitive", physical_state="solid",
418
+ ),
419
+ "pd_oac_2": Reagent(
420
+ name="Palladium(II) acetate", formula="Pd(OAc)2", cas="3375-31-3",
421
+ mw=224.51, cost_per_kg=10000,
422
+ ghs_hazards=["H302", "H315", "H319"],
423
+ ghs_pictograms=["GHS07"],
424
+ storage="Cool dry place, light-sensitive", physical_state="solid",
425
+ ),
426
+ "cui": Reagent(
427
+ name="Copper(I) iodide", formula="CuI", cas="7681-65-4",
428
+ mw=190.45, cost_per_kg=120,
429
+ ghs_hazards=["H302", "H315", "H319", "H335", "H410"],
430
+ ghs_pictograms=["GHS07", "GHS09"],
431
+ storage="Cool dry place, light-sensitive", physical_state="solid",
432
+ ),
433
+ "ni_cod_2": Reagent(
434
+ name="Bis(1,5-cyclooctadiene)nickel(0)", formula="Ni(cod)2",
435
+ cas="1295-35-8", mw=275.04, cost_per_kg=18000,
436
+ ghs_hazards=["H250", "H302", "H315", "H317", "H319", "H334", "H341", "H350", "H360", "H372"],
437
+ ghs_pictograms=["GHS02", "GHS07", "GHS08"],
438
+ storage="Glovebox, -20 C, extremely air-sensitive", physical_state="solid",
439
+ ),
440
+
441
+ # -----------------------------------------------------------------
442
+ # Bases (organic)
443
+ # -----------------------------------------------------------------
444
+ "et3n": Reagent(
445
+ name="Triethylamine", formula="(C2H5)3N", cas="121-44-8",
446
+ mw=101.19, cost_per_kg=22,
447
+ ghs_hazards=["H225", "H302", "H311", "H314", "H331"],
448
+ ghs_pictograms=["GHS02", "GHS05", "GHS06"],
449
+ storage="Flammable cabinet, away from acids", physical_state="liquid",
450
+ ),
451
+ "dmap": Reagent(
452
+ name="4-Dimethylaminopyridine", formula="C7H10N2", cas="1122-58-3",
453
+ mw=122.17, cost_per_kg=250,
454
+ ghs_hazards=["H301", "H311", "H331"],
455
+ ghs_pictograms=["GHS06"],
456
+ storage="Cool dry place", physical_state="solid",
457
+ ),
458
+ "dbu": Reagent(
459
+ name="1,8-Diazabicyclo[5.4.0]undec-7-ene", formula="C9H16N2",
460
+ cas="6674-22-2", mw=152.24, cost_per_kg=110,
461
+ ghs_hazards=["H302", "H311", "H314"],
462
+ ghs_pictograms=["GHS05", "GHS07"],
463
+ storage="Inert atmosphere", physical_state="liquid",
464
+ ),
465
+ "nah": Reagent(
466
+ name="Sodium hydride (60% in mineral oil)", formula="NaH",
467
+ cas="7646-69-7", mw=24.00, cost_per_kg=65,
468
+ ghs_hazards=["H260", "H314"],
469
+ ghs_pictograms=["GHS02", "GHS05"],
470
+ storage="Glovebox or Schlenk line", physical_state="solid",
471
+ ),
472
+ "k2co3": Reagent(
473
+ name="Potassium carbonate", formula="K2CO3", cas="584-08-7",
474
+ mw=138.21, cost_per_kg=10,
475
+ ghs_hazards=["H315", "H319", "H335"],
476
+ ghs_pictograms=["GHS07"],
477
+ storage="Dry, tightly sealed", physical_state="solid",
478
+ ),
479
+ "cs2co3": Reagent(
480
+ name="Cesium carbonate", formula="Cs2CO3", cas="534-17-8",
481
+ mw=325.82, cost_per_kg=400,
482
+ ghs_hazards=["H315", "H319", "H335"],
483
+ ghs_pictograms=["GHS07"],
484
+ storage="Dry, tightly sealed, hygroscopic", physical_state="solid",
485
+ ),
486
+ "pyridine": Reagent(
487
+ name="Pyridine", formula="C5H5N", cas="110-86-1",
488
+ mw=79.10, cost_per_kg=25,
489
+ ghs_hazards=["H225", "H302", "H312", "H332"],
490
+ ghs_pictograms=["GHS02", "GHS07"],
491
+ storage="Flammable cabinet", physical_state="liquid",
492
+ ),
493
+ "dipea": Reagent(
494
+ name="N,N-Diisopropylethylamine (Hunig's base)", formula="(iPr)2NEt",
495
+ cas="7087-68-5", mw=129.25, cost_per_kg=50,
496
+ ghs_hazards=["H225", "H302", "H311", "H314", "H331"],
497
+ ghs_pictograms=["GHS02", "GHS05", "GHS06"],
498
+ storage="Flammable cabinet, inert atmosphere", physical_state="liquid",
499
+ ),
500
+
501
+ # -----------------------------------------------------------------
502
+ # Acids
503
+ # -----------------------------------------------------------------
504
+ "hcl": Reagent(
505
+ name="Hydrochloric acid (conc. 37%)", formula="HCl", cas="7647-01-0",
506
+ mw=36.46, cost_per_kg=6,
507
+ ghs_hazards=["H290", "H314", "H335"],
508
+ ghs_pictograms=["GHS05", "GHS07"],
509
+ storage="Acid cabinet", physical_state="liquid",
510
+ ),
511
+ "h2so4": Reagent(
512
+ name="Sulfuric acid (conc.)", formula="H2SO4", cas="7664-93-9",
513
+ mw=98.08, cost_per_kg=8,
514
+ ghs_hazards=["H290", "H314"],
515
+ ghs_pictograms=["GHS05"],
516
+ storage="Acid cabinet, separate from organics", physical_state="liquid",
517
+ ),
518
+ "hno3": Reagent(
519
+ name="Nitric acid (conc. 70%)", formula="HNO3", cas="7697-37-2",
520
+ mw=63.01, cost_per_kg=10,
521
+ ghs_hazards=["H272", "H290", "H314"],
522
+ ghs_pictograms=["GHS03", "GHS05"],
523
+ storage="Acid cabinet, separate from organics", physical_state="liquid",
524
+ ),
525
+ "tfa": Reagent(
526
+ name="Trifluoroacetic acid", formula="CF3COOH", cas="76-05-1",
527
+ mw=114.02, cost_per_kg=55,
528
+ ghs_hazards=["H290", "H314", "H332"],
529
+ ghs_pictograms=["GHS05", "GHS07"],
530
+ storage="Acid cabinet, tightly sealed", physical_state="liquid",
531
+ ),
532
+ "acoh": Reagent(
533
+ name="Acetic acid (glacial)", formula="CH3COOH", cas="64-19-7",
534
+ mw=60.05, cost_per_kg=12,
535
+ ghs_hazards=["H226", "H314"],
536
+ ghs_pictograms=["GHS02", "GHS05"],
537
+ storage="Acid/flammable cabinet", physical_state="liquid",
538
+ ),
539
+ "p_tsoh": Reagent(
540
+ name="para-Toluenesulfonic acid monohydrate", formula="CH3C6H4SO3H*H2O",
541
+ cas="6192-52-5", mw=190.22, cost_per_kg=25,
542
+ ghs_hazards=["H302", "H314", "H318"],
543
+ ghs_pictograms=["GHS05", "GHS07"],
544
+ storage="Dry, tightly sealed", physical_state="solid",
545
+ ),
546
+ "bf3_oet2": Reagent(
547
+ name="Boron trifluoride diethyl etherate", formula="BF3*OEt2",
548
+ cas="109-63-7", mw=141.93, cost_per_kg=45,
549
+ ghs_hazards=["H226", "H302", "H314", "H331"],
550
+ ghs_pictograms=["GHS02", "GHS05", "GHS06"],
551
+ storage="Inert atmosphere, moisture-sensitive", physical_state="liquid",
552
+ ),
553
+ "ticl4": Reagent(
554
+ name="Titanium(IV) chloride", formula="TiCl4", cas="7550-45-0",
555
+ mw=189.68, cost_per_kg=60,
556
+ ghs_hazards=["H290", "H314", "H330", "H335"],
557
+ ghs_pictograms=["GHS05", "GHS06"],
558
+ storage="Inert atmosphere, fume hood, moisture-sensitive", physical_state="liquid",
559
+ ),
560
+ "alcl3": Reagent(
561
+ name="Aluminium chloride", formula="AlCl3", cas="7446-70-0",
562
+ mw=133.34, cost_per_kg=20,
563
+ ghs_hazards=["H290", "H302", "H314"],
564
+ ghs_pictograms=["GHS05", "GHS07"],
565
+ storage="Inert atmosphere, moisture-sensitive", physical_state="solid",
566
+ ),
567
+
568
+ # -----------------------------------------------------------------
569
+ # Protection reagents
570
+ # -----------------------------------------------------------------
571
+ "boc2o": Reagent(
572
+ name="Di-tert-butyl dicarbonate", formula="(Boc)2O", cas="24424-99-5",
573
+ mw=218.25, cost_per_kg=100,
574
+ ghs_hazards=["H228", "H302"],
575
+ ghs_pictograms=["GHS02", "GHS07"],
576
+ storage="Fridge", physical_state="solid",
577
+ ),
578
+ "fmoc_cl": Reagent(
579
+ name="9-Fluorenylmethyl chloroformate", formula="FmocCl",
580
+ cas="28920-43-6", mw=258.70, cost_per_kg=350,
581
+ ghs_hazards=["H302", "H315", "H319"],
582
+ ghs_pictograms=["GHS07"],
583
+ storage="Fridge, moisture-sensitive", physical_state="solid",
584
+ ),
585
+ "tbscl": Reagent(
586
+ name="tert-Butyldimethylsilyl chloride", formula="TBSCl",
587
+ cas="18162-48-6", mw=150.72, cost_per_kg=120,
588
+ ghs_hazards=["H228", "H302", "H314"],
589
+ ghs_pictograms=["GHS02", "GHS05", "GHS07"],
590
+ storage="Dry, inert atmosphere", physical_state="solid",
591
+ ),
592
+ "tbdpscl": Reagent(
593
+ name="tert-Butyldiphenylsilyl chloride", formula="TBDPSCl",
594
+ cas="58479-61-1", mw=274.87, cost_per_kg=300,
595
+ ghs_hazards=["H302", "H314"],
596
+ ghs_pictograms=["GHS05", "GHS07"],
597
+ storage="Inert atmosphere, moisture-sensitive", physical_state="liquid",
598
+ ),
599
+ "pmbcl": Reagent(
600
+ name="para-Methoxybenzyl chloride", formula="PMBCl", cas="824-94-2",
601
+ mw=156.61, cost_per_kg=80,
602
+ ghs_hazards=["H302", "H315", "H319"],
603
+ ghs_pictograms=["GHS07"],
604
+ storage="Fridge, moisture-sensitive", physical_state="liquid",
605
+ ),
606
+ "ac2o": Reagent(
607
+ name="Acetic anhydride", formula="(CH3CO)2O", cas="108-24-7",
608
+ mw=102.09, cost_per_kg=15,
609
+ ghs_hazards=["H226", "H302", "H314", "H332"],
610
+ ghs_pictograms=["GHS02", "GHS05", "GHS07"],
611
+ storage="Flammable cabinet, moisture-sensitive", physical_state="liquid",
612
+ ),
613
+
614
+ # -----------------------------------------------------------------
615
+ # Deprotection reagents
616
+ # -----------------------------------------------------------------
617
+ "tbaf": Reagent(
618
+ name="Tetrabutylammonium fluoride (1 M in THF)", formula="TBAF",
619
+ cas="429-41-4", mw=261.46, cost_per_kg=500,
620
+ ghs_hazards=["H225", "H302", "H314"],
621
+ ghs_pictograms=["GHS02", "GHS05", "GHS07"],
622
+ storage="Sure-seal, fridge", physical_state="liquid",
623
+ ),
624
+ "hf_pyridine": Reagent(
625
+ name="Hydrogen fluoride / pyridine (Olah's reagent)", formula="HF*pyr",
626
+ cas="32001-55-1", mw=0.0, cost_per_kg=200,
627
+ ghs_hazards=["H300", "H310", "H314", "H330"],
628
+ ghs_pictograms=["GHS05", "GHS06"],
629
+ storage="Polyethylene container, CaF2 antidote nearby", physical_state="liquid",
630
+ ),
631
+ "ddq": Reagent(
632
+ name="2,3-Dichloro-5,6-dicyano-1,4-benzoquinone", formula="DDQ",
633
+ cas="84-58-2", mw=227.00, cost_per_kg=500,
634
+ ghs_hazards=["H301", "H311", "H319", "H331"],
635
+ ghs_pictograms=["GHS06"],
636
+ storage="Cool dry place, light-sensitive", physical_state="solid",
637
+ ),
638
+
639
+ # -----------------------------------------------------------------
640
+ # Miscellaneous
641
+ # -----------------------------------------------------------------
642
+ "pph3": Reagent(
643
+ name="Triphenylphosphine", formula="PPh3", cas="603-35-0",
644
+ mw=262.29, cost_per_kg=50,
645
+ ghs_hazards=["H302", "H315", "H319"],
646
+ ghs_pictograms=["GHS07"],
647
+ storage="Room temperature", physical_state="solid",
648
+ ),
649
+ "grubbs_1": Reagent(
650
+ name="Grubbs catalyst 1st generation", formula="Cl2(PCy3)2Ru=CHPh",
651
+ cas="172222-30-9", mw=822.96, cost_per_kg=25000,
652
+ ghs_hazards=["H315", "H319", "H335"],
653
+ ghs_pictograms=["GHS07"],
654
+ storage="Glovebox, -20 C, inert atmosphere", physical_state="solid",
655
+ ),
656
+ "grubbs_2": Reagent(
657
+ name="Grubbs catalyst 2nd generation",
658
+ formula="Cl2(IMes)(PCy3)Ru=CHPh", cas="246047-72-3",
659
+ mw=848.97, cost_per_kg=28000,
660
+ ghs_hazards=["H315", "H319", "H335"],
661
+ ghs_pictograms=["GHS07"],
662
+ storage="Glovebox, -20 C, inert atmosphere", physical_state="solid",
663
+ ),
664
+ "socl2": Reagent(
665
+ name="Thionyl chloride", formula="SOCl2", cas="7719-09-7",
666
+ mw=118.97, cost_per_kg=25,
667
+ ghs_hazards=["H302", "H314", "H331"],
668
+ ghs_pictograms=["GHS05", "GHS06"],
669
+ storage="Inert atmosphere, moisture-sensitive", physical_state="liquid",
670
+ ),
671
+ "pcl5": Reagent(
672
+ name="Phosphorus pentachloride", formula="PCl5", cas="10026-13-8",
673
+ mw=208.24, cost_per_kg=40,
674
+ ghs_hazards=["H290", "H302", "H314"],
675
+ ghs_pictograms=["GHS05", "GHS07"],
676
+ storage="Inert atmosphere, moisture-sensitive", physical_state="solid",
677
+ ),
678
+ "p2o5": Reagent(
679
+ name="Phosphorus pentoxide", formula="P2O5", cas="1314-56-3",
680
+ mw=141.94, cost_per_kg=20,
681
+ ghs_hazards=["H290", "H314"],
682
+ ghs_pictograms=["GHS05"],
683
+ storage="Tightly sealed, extremely hygroscopic", physical_state="solid",
684
+ ),
685
+ "diad": Reagent(
686
+ name="Diisopropyl azodicarboxylate", formula="iPrO2CN=NCO2iPr",
687
+ cas="2446-83-5", mw=202.21, cost_per_kg=180,
688
+ ghs_hazards=["H225", "H302", "H312", "H315", "H319", "H332"],
689
+ ghs_pictograms=["GHS02", "GHS07"],
690
+ storage="Fridge, flammable cabinet", physical_state="liquid",
691
+ ),
692
+ "dead": Reagent(
693
+ name="Diethyl azodicarboxylate", formula="EtO2CN=NCO2Et",
694
+ cas="1972-28-7", mw=174.15, cost_per_kg=160,
695
+ ghs_hazards=["H225", "H301", "H311", "H315", "H319", "H331", "H335", "H351"],
696
+ ghs_pictograms=["GHS02", "GHS06", "GHS08"],
697
+ storage="Fridge, flammable cabinet", physical_state="liquid",
698
+ ),
699
+ "imidazole": Reagent(
700
+ name="Imidazole", formula="C3H4N2", cas="288-32-4",
701
+ mw=68.08, cost_per_kg=30,
702
+ ghs_hazards=["H302", "H314"],
703
+ ghs_pictograms=["GHS05", "GHS07"],
704
+ storage="Room temperature", physical_state="solid",
705
+ ),
706
+ "n2h4": Reagent(
707
+ name="Hydrazine monohydrate", formula="N2H4*H2O", cas="7803-57-8",
708
+ mw=50.06, cost_per_kg=40,
709
+ ghs_hazards=["H226", "H301", "H311", "H314", "H317", "H331", "H350", "H410"],
710
+ ghs_pictograms=["GHS02", "GHS05", "GHS06", "GHS08", "GHS09"],
711
+ storage="Flammable cabinet, poison area", physical_state="liquid",
712
+ ),
713
+ "zncl2": Reagent(
714
+ name="Zinc chloride", formula="ZnCl2", cas="7646-85-7",
715
+ mw=136.30, cost_per_kg=15,
716
+ ghs_hazards=["H290", "H302", "H314", "H410"],
717
+ ghs_pictograms=["GHS05", "GHS07", "GHS09"],
718
+ storage="Dry, tightly sealed", physical_state="solid",
719
+ ),
720
+ "znbr2": Reagent(
721
+ name="Zinc bromide", formula="ZnBr2", cas="7699-45-8",
722
+ mw=225.20, cost_per_kg=50,
723
+ ghs_hazards=["H302", "H314", "H410"],
724
+ ghs_pictograms=["GHS05", "GHS07", "GHS09"],
725
+ storage="Dry, tightly sealed, hygroscopic", physical_state="solid",
726
+ ),
727
+ "cul": Reagent(
728
+ name="Copper(I) chloride", formula="CuCl", cas="7758-89-6",
729
+ mw=98.99, cost_per_kg=30,
730
+ ghs_hazards=["H302", "H400", "H410"],
731
+ ghs_pictograms=["GHS07", "GHS09"],
732
+ storage="Inert atmosphere", physical_state="solid",
733
+ ),
734
+ "mgso4": Reagent(
735
+ name="Magnesium sulfate (anhydrous, drying agent)", formula="MgSO4",
736
+ cas="7487-88-9", mw=120.37, cost_per_kg=8,
737
+ ghs_hazards=[], ghs_pictograms=[],
738
+ storage="Tightly sealed", physical_state="solid",
739
+ ),
740
+ "na2so4": Reagent(
741
+ name="Sodium sulfate (anhydrous, drying agent)", formula="Na2SO4",
742
+ cas="7757-82-6", mw=142.04, cost_per_kg=5,
743
+ ghs_hazards=[], ghs_pictograms=[],
744
+ storage="Tightly sealed", physical_state="solid",
745
+ ),
746
+ "nahco3": Reagent(
747
+ name="Sodium bicarbonate", formula="NaHCO3", cas="144-55-8",
748
+ mw=84.01, cost_per_kg=4,
749
+ ghs_hazards=[], ghs_pictograms=[],
750
+ storage="Room temperature", physical_state="solid",
751
+ ),
752
+ "nh4cl": Reagent(
753
+ name="Ammonium chloride", formula="NH4Cl", cas="12125-02-9",
754
+ mw=53.49, cost_per_kg=6,
755
+ ghs_hazards=["H302", "H319"],
756
+ ghs_pictograms=["GHS07"],
757
+ storage="Room temperature", physical_state="solid",
758
+ ),
759
+ "lda": Reagent(
760
+ name="Lithium diisopropylamide (2 M in THF/heptane)", formula="LDA",
761
+ cas="4111-54-0", mw=107.12, cost_per_kg=500,
762
+ ghs_hazards=["H225", "H250", "H260", "H314"],
763
+ ghs_pictograms=["GHS02", "GHS05"],
764
+ storage="Sure-seal, -20 C", physical_state="liquid",
765
+ ),
766
+ "lhmds": Reagent(
767
+ name="Lithium bis(trimethylsilyl)amide (1 M in THF)", formula="LiHMDS",
768
+ cas="4039-32-1", mw=167.33, cost_per_kg=450,
769
+ ghs_hazards=["H225", "H250", "H260", "H314"],
770
+ ghs_pictograms=["GHS02", "GHS05"],
771
+ storage="Sure-seal, -20 C", physical_state="liquid",
772
+ ),
773
+ "nahmds": Reagent(
774
+ name="Sodium bis(trimethylsilyl)amide (1 M in THF)", formula="NaHMDS",
775
+ cas="1070-89-9", mw=183.37, cost_per_kg=400,
776
+ ghs_hazards=["H225", "H250", "H260", "H314"],
777
+ ghs_pictograms=["GHS02", "GHS05"],
778
+ storage="Sure-seal, -20 C", physical_state="liquid",
779
+ ),
780
+ "khmds": Reagent(
781
+ name="Potassium bis(trimethylsilyl)amide (0.5 M in toluene)",
782
+ formula="KHMDS", cas="40949-94-8", mw=199.47, cost_per_kg=500,
783
+ ghs_hazards=["H225", "H250", "H260", "H314"],
784
+ ghs_pictograms=["GHS02", "GHS05"],
785
+ storage="Sure-seal, -20 C", physical_state="liquid",
786
+ ),
787
+ "o3": Reagent(
788
+ name="Ozone (generated in situ)", formula="O3",
789
+ mw=48.00, cost_per_kg=0,
790
+ ghs_hazards=["H270", "H314", "H330"],
791
+ ghs_pictograms=["GHS03", "GHS05", "GHS06"],
792
+ storage="Generated from O2 via ozonizer", physical_state="gas",
793
+ ),
794
+ "me2s": Reagent(
795
+ name="Dimethyl sulfide", formula="(CH3)2S", cas="75-18-3",
796
+ mw=62.13, cost_per_kg=15,
797
+ ghs_hazards=["H225", "H302", "H332"],
798
+ ghs_pictograms=["GHS02", "GHS07"],
799
+ storage="Flammable cabinet, fume hood (stench)", physical_state="liquid",
800
+ ),
801
+ "ph3p_chco2et": Reagent(
802
+ name="Ethyl (triphenylphosphoranylidene)acetate (stabilized Wittig)",
803
+ formula="Ph3P=CHCO2Et", cas="1099-45-2", mw=348.39, cost_per_kg=300,
804
+ ghs_hazards=["H302", "H315", "H319"],
805
+ ghs_pictograms=["GHS07"],
806
+ storage="Room temperature", physical_state="solid",
807
+ ),
808
+ "ch2i2": Reagent(
809
+ name="Diiodomethane", formula="CH2I2", cas="75-11-6",
810
+ mw=267.84, cost_per_kg=80,
811
+ ghs_hazards=["H302", "H315", "H319", "H335"],
812
+ ghs_pictograms=["GHS07"],
813
+ storage="Amber bottle, fridge", physical_state="liquid",
814
+ ),
815
+ "znet2": Reagent(
816
+ name="Diethylzinc (1 M in hexanes)", formula="ZnEt2",
817
+ cas="557-20-0", mw=123.53, cost_per_kg=350,
818
+ ghs_hazards=["H250", "H260", "H302", "H314"],
819
+ ghs_pictograms=["GHS02", "GHS05", "GHS07"],
820
+ storage="Sure-seal, glovebox", physical_state="liquid",
821
+ ),
822
+ "bu3snh": Reagent(
823
+ name="Tributyltin hydride", formula="Bu3SnH", cas="688-73-3",
824
+ mw=291.06, cost_per_kg=200,
825
+ ghs_hazards=["H301", "H311", "H315", "H319", "H331", "H360", "H372", "H410"],
826
+ ghs_pictograms=["GHS06", "GHS08", "GHS09"],
827
+ storage="Fridge, inert atmosphere", physical_state="liquid",
828
+ ),
829
+ "aibn": Reagent(
830
+ name="Azobisisobutyronitrile", formula="(CH3)2C(CN)N=NC(CN)(CH3)2",
831
+ cas="78-67-1", mw=164.21, cost_per_kg=50,
832
+ ghs_hazards=["H242", "H302", "H412"],
833
+ ghs_pictograms=["GHS02", "GHS07"],
834
+ storage="Freezer, shock-sensitive", physical_state="solid",
835
+ ),
836
+ "nbs": Reagent(
837
+ name="N-Bromosuccinimide", formula="C4H4BrNO2", cas="128-08-5",
838
+ mw=177.98, cost_per_kg=45,
839
+ ghs_hazards=["H302", "H315", "H319"],
840
+ ghs_pictograms=["GHS07"],
841
+ storage="Cool dry place, light-sensitive", physical_state="solid",
842
+ ),
843
+ "ncs": Reagent(
844
+ name="N-Chlorosuccinimide", formula="C4H4ClNO2", cas="128-09-6",
845
+ mw=133.53, cost_per_kg=40,
846
+ ghs_hazards=["H302", "H314"],
847
+ ghs_pictograms=["GHS05", "GHS07"],
848
+ storage="Cool dry place", physical_state="solid",
849
+ ),
850
+ "br2": Reagent(
851
+ name="Bromine", formula="Br2", cas="7726-95-6",
852
+ mw=159.81, cost_per_kg=30,
853
+ ghs_hazards=["H314", "H330", "H400"],
854
+ ghs_pictograms=["GHS05", "GHS06", "GHS09"],
855
+ storage="Corrosive cabinet, fume hood", physical_state="liquid",
856
+ ),
857
+ "i2": Reagent(
858
+ name="Iodine", formula="I2", cas="7553-56-2",
859
+ mw=253.81, cost_per_kg=60,
860
+ ghs_hazards=["H302", "H312", "H332", "H400"],
861
+ ghs_pictograms=["GHS07", "GHS09"],
862
+ storage="Cool dry place", physical_state="solid",
863
+ ),
864
+ "9_bbn": Reagent(
865
+ name="9-Borabicyclo[3.3.1]nonane (0.5 M in THF)", formula="9-BBN",
866
+ cas="280-64-8", mw=122.02, cost_per_kg=400,
867
+ ghs_hazards=["H225", "H250", "H260", "H314"],
868
+ ghs_pictograms=["GHS02", "GHS05"],
869
+ storage="Sure-seal, inert atmosphere", physical_state="liquid",
870
+ ),
871
+ "bh3_thf": Reagent(
872
+ name="Borane-THF complex (1 M in THF)", formula="BH3*THF",
873
+ cas="14044-65-6", mw=85.94, cost_per_kg=250,
874
+ ghs_hazards=["H225", "H250", "H260", "H314"],
875
+ ghs_pictograms=["GHS02", "GHS05"],
876
+ storage="Sure-seal, strict inert atmosphere, fridge", physical_state="liquid",
877
+ ),
878
+ "b2h6": Reagent(
879
+ name="Diborane (gas)", formula="B2H6",
880
+ cas="19287-45-7", mw=27.67, cost_per_kg=0,
881
+ ghs_hazards=["H220", "H250", "H330", "H314"],
882
+ ghs_pictograms=["GHS02", "GHS05", "GHS06"],
883
+ storage="Gas cylinder, pyrophoric", physical_state="gas",
884
+ ),
885
+ "phthalimide_k": Reagent(
886
+ name="Potassium phthalimide", formula="C8H4KNO2", cas="1074-82-4",
887
+ mw=185.22, cost_per_kg=30,
888
+ ghs_hazards=["H302", "H315", "H319"],
889
+ ghs_pictograms=["GHS07"],
890
+ storage="Room temperature", physical_state="solid",
891
+ ),
892
+ "nh2nh2": Reagent(
893
+ name="Hydrazine (anhydrous)", formula="N2H4", cas="302-01-2",
894
+ mw=32.05, cost_per_kg=50,
895
+ ghs_hazards=["H226", "H301", "H311", "H314", "H317", "H331", "H350", "H410"],
896
+ ghs_pictograms=["GHS02", "GHS05", "GHS06", "GHS08", "GHS09"],
897
+ storage="Flammable, poison cabinet", physical_state="liquid",
898
+ ),
899
+ "crcl2": Reagent(
900
+ name="Chromium(II) chloride", formula="CrCl2", cas="10049-05-5",
901
+ mw=122.90, cost_per_kg=200,
902
+ ghs_hazards=["H302", "H315", "H319", "H335"],
903
+ ghs_pictograms=["GHS07"],
904
+ storage="Glovebox, air-sensitive", physical_state="solid",
905
+ ),
906
+ "pd_c_10": Reagent(
907
+ name="Palladium on carbon (10 wt%)", formula="Pd/C",
908
+ cas="7440-05-3", mw=106.42, cost_per_kg=900,
909
+ ghs_hazards=["H228"],
910
+ ghs_pictograms=["GHS02"],
911
+ storage="Keep wetted with water to prevent ignition", physical_state="solid",
912
+ ),
913
+ "lindlar": Reagent(
914
+ name="Lindlar catalyst (Pd/CaCO3/Pb)", formula="Pd/CaCO3/Pb(OAc)2",
915
+ mw=0.0, cost_per_kg=2000,
916
+ ghs_hazards=["H302", "H332", "H360", "H373"],
917
+ ghs_pictograms=["GHS07", "GHS08"],
918
+ storage="Room temperature, keep dry", physical_state="solid",
919
+ ),
920
+ "sncl2": Reagent(
921
+ name="Tin(II) chloride dihydrate", formula="SnCl2*2H2O",
922
+ cas="10025-69-1", mw=225.65, cost_per_kg=25,
923
+ ghs_hazards=["H302", "H315", "H319"],
924
+ ghs_pictograms=["GHS07"],
925
+ storage="Cool dry place", physical_state="solid",
926
+ ),
927
+ "samarium_ii_iodide": Reagent(
928
+ name="Samarium(II) iodide (0.1 M in THF)", formula="SmI2",
929
+ cas="32248-43-4", mw=404.16, cost_per_kg=5000,
930
+ ghs_hazards=["H225", "H315", "H319"],
931
+ ghs_pictograms=["GHS02", "GHS07"],
932
+ storage="Sure-seal, inert atmosphere, air-sensitive", physical_state="liquid",
933
+ ),
934
+ "ticl3": Reagent(
935
+ name="Titanium(III) chloride", formula="TiCl3", cas="7705-07-9",
936
+ mw=154.23, cost_per_kg=80,
937
+ ghs_hazards=["H302", "H314"],
938
+ ghs_pictograms=["GHS05", "GHS07"],
939
+ storage="Inert atmosphere", physical_state="solid",
940
+ ),
941
+ "pd2_dba_3": Reagent(
942
+ name="Tris(dibenzylideneacetone)dipalladium(0)",
943
+ formula="Pd2(dba)3", cas="51364-51-3", mw=915.72, cost_per_kg=14000,
944
+ ghs_hazards=["H315", "H319", "H335"],
945
+ ghs_pictograms=["GHS07"],
946
+ storage="Glovebox, inert atmosphere, light-sensitive", physical_state="solid",
947
+ ),
948
+ "sphos": Reagent(
949
+ name="2-Dicyclohexylphosphino-2',6'-dimethoxybiphenyl (SPhos)",
950
+ formula="SPhos", cas="657408-07-6", mw=414.54, cost_per_kg=8000,
951
+ ghs_hazards=["H302", "H315", "H319"],
952
+ ghs_pictograms=["GHS07"],
953
+ storage="Inert atmosphere, room temperature", physical_state="solid",
954
+ ),
955
+ "xphos": Reagent(
956
+ name="2-Dicyclohexylphosphino-2',4',6'-triisopropylbiphenyl (XPhos)",
957
+ formula="XPhos", cas="564483-18-7", mw=476.67, cost_per_kg=9000,
958
+ ghs_hazards=["H302", "H315", "H319"],
959
+ ghs_pictograms=["GHS07"],
960
+ storage="Inert atmosphere, room temperature", physical_state="solid",
961
+ ),
962
+ "bu4nf": Reagent(
963
+ name="Tetrabutylammonium fluoride trihydrate", formula="Bu4NF*3H2O",
964
+ cas="22206-57-1", mw=315.51, cost_per_kg=450,
965
+ ghs_hazards=["H302", "H314"],
966
+ ghs_pictograms=["GHS05", "GHS07"],
967
+ storage="Fridge, hygroscopic", physical_state="solid",
968
+ ),
969
+ "hbf4": Reagent(
970
+ name="Tetrafluoroboric acid (48% in water)", formula="HBF4",
971
+ cas="16872-11-0", mw=87.81, cost_per_kg=35,
972
+ ghs_hazards=["H290", "H314"],
973
+ ghs_pictograms=["GHS05"],
974
+ storage="Acid cabinet", physical_state="liquid",
975
+ ),
976
+ "bpin2": Reagent(
977
+ name="Bis(pinacolato)diboron", formula="B2pin2", cas="73183-34-3",
978
+ mw=253.94, cost_per_kg=250,
979
+ ghs_hazards=["H302", "H315", "H319"],
980
+ ghs_pictograms=["GHS07"],
981
+ storage="Room temperature, moisture-sensitive", physical_state="solid",
982
+ ),
983
+ "me3sn_snme3": Reagent(
984
+ name="Hexamethylditin", formula="Me3SnSnMe3", cas="661-69-8",
985
+ mw=327.59, cost_per_kg=1500,
986
+ ghs_hazards=["H301", "H311", "H315", "H319", "H331", "H360", "H372", "H410"],
987
+ ghs_pictograms=["GHS06", "GHS08", "GHS09"],
988
+ storage="Fridge, inert atmosphere", physical_state="liquid",
989
+ ),
990
+ }
991
+
992
+
993
+ # =====================================================================
994
+ # SOLVENT_DB (~30 entries)
995
+ # =====================================================================
996
+
997
+ SOLVENT_DB: dict[str, Solvent] = {
998
+ "water": Solvent(
999
+ name="Water", formula="H2O", bp=100.0, mp=0.0,
1000
+ density=1.00, dielectric=80.1, polarity_index=10.2,
1001
+ cas="7732-18-5", cost_per_L=0.05, green_score=1,
1002
+ ghs_hazards=[], miscible_with_water=True,
1003
+ ),
1004
+ "meoh": Solvent(
1005
+ name="Methanol", formula="CH3OH", bp=64.7, mp=-97.6,
1006
+ density=0.791, dielectric=32.7, polarity_index=5.1,
1007
+ cas="67-56-1", cost_per_L=8, green_score=3,
1008
+ ghs_hazards=["H225", "H301", "H311", "H331"],
1009
+ miscible_with_water=True,
1010
+ ),
1011
+ "etoh": Solvent(
1012
+ name="Ethanol", formula="C2H5OH", bp=78.4, mp=-114.1,
1013
+ density=0.789, dielectric=24.5, polarity_index=5.2,
1014
+ cas="64-17-5", cost_per_L=10, green_score=2,
1015
+ ghs_hazards=["H225"], miscible_with_water=True,
1016
+ ),
1017
+ "iproh": Solvent(
1018
+ name="Isopropanol", formula="(CH3)2CHOH", bp=82.6, mp=-89.5,
1019
+ density=0.786, dielectric=17.9, polarity_index=3.9,
1020
+ cas="67-63-0", cost_per_L=9, green_score=2,
1021
+ ghs_hazards=["H225", "H319", "H336"],
1022
+ miscible_with_water=True,
1023
+ ),
1024
+ "nbuoh": Solvent(
1025
+ name="n-Butanol", formula="C4H9OH", bp=117.7, mp=-89.8,
1026
+ density=0.810, dielectric=17.8, polarity_index=3.9,
1027
+ cas="71-36-3", cost_per_L=12, green_score=3,
1028
+ ghs_hazards=["H226", "H302", "H315", "H318", "H335", "H336"],
1029
+ miscible_with_water=False,
1030
+ ),
1031
+ "dcm": Solvent(
1032
+ name="Dichloromethane", formula="CH2Cl2", bp=39.6, mp=-96.7,
1033
+ density=1.325, dielectric=8.9, polarity_index=3.1,
1034
+ cas="75-09-2", cost_per_L=12, green_score=7,
1035
+ ghs_hazards=["H302", "H315", "H336", "H351"],
1036
+ miscible_with_water=False,
1037
+ ),
1038
+ "chcl3": Solvent(
1039
+ name="Chloroform", formula="CHCl3", bp=61.2, mp=-63.5,
1040
+ density=1.489, dielectric=4.8, polarity_index=4.1,
1041
+ cas="67-66-3", cost_per_L=14, green_score=8,
1042
+ ghs_hazards=["H302", "H315", "H319", "H331", "H336", "H351", "H361", "H372"],
1043
+ miscible_with_water=False,
1044
+ ),
1045
+ "ccl4": Solvent(
1046
+ name="Carbon tetrachloride", formula="CCl4", bp=76.7, mp=-22.9,
1047
+ density=1.594, dielectric=2.2, polarity_index=1.6,
1048
+ cas="56-23-5", cost_per_L=20, green_score=10,
1049
+ ghs_hazards=["H301", "H311", "H331", "H351", "H372", "H412", "H420"],
1050
+ miscible_with_water=False,
1051
+ ),
1052
+ "et2o": Solvent(
1053
+ name="Diethyl ether", formula="(C2H5)2O", bp=34.6, mp=-116.3,
1054
+ density=0.713, dielectric=4.3, polarity_index=2.8,
1055
+ cas="60-29-7", cost_per_L=15, green_score=5,
1056
+ ghs_hazards=["H224", "H302", "H336"],
1057
+ miscible_with_water=False,
1058
+ ),
1059
+ "thf": Solvent(
1060
+ name="Tetrahydrofuran", formula="C4H8O", bp=66.0, mp=-108.4,
1061
+ density=0.889, dielectric=7.5, polarity_index=4.0,
1062
+ cas="109-99-9", cost_per_L=18, green_score=5,
1063
+ ghs_hazards=["H225", "H302", "H319", "H335"],
1064
+ miscible_with_water=True,
1065
+ ),
1066
+ "1,4_dioxane": Solvent(
1067
+ name="1,4-Dioxane", formula="C4H8O2", bp=101.1, mp=11.8,
1068
+ density=1.033, dielectric=2.2, polarity_index=4.8,
1069
+ cas="123-91-1", cost_per_L=20, green_score=8,
1070
+ ghs_hazards=["H225", "H302", "H319", "H335", "H351"],
1071
+ miscible_with_water=True,
1072
+ ),
1073
+ "mtbe": Solvent(
1074
+ name="Methyl tert-butyl ether", formula="(CH3)3COCH3", bp=55.2, mp=-108.6,
1075
+ density=0.740, dielectric=2.6, polarity_index=2.5,
1076
+ cas="1634-04-4", cost_per_L=15, green_score=4,
1077
+ ghs_hazards=["H225", "H335"],
1078
+ miscible_with_water=False,
1079
+ ),
1080
+ "2_methf": Solvent(
1081
+ name="2-Methyltetrahydrofuran", formula="C5H10O", bp=80.0, mp=-136.0,
1082
+ density=0.854, dielectric=6.2, polarity_index=3.5,
1083
+ cas="96-47-9", cost_per_L=25, green_score=3,
1084
+ ghs_hazards=["H225", "H335"],
1085
+ miscible_with_water=False,
1086
+ ),
1087
+ "acetone": Solvent(
1088
+ name="Acetone", formula="(CH3)2CO", bp=56.1, mp=-94.7,
1089
+ density=0.791, dielectric=20.7, polarity_index=5.1,
1090
+ cas="67-64-1", cost_per_L=8, green_score=3,
1091
+ ghs_hazards=["H225", "H319", "H336"],
1092
+ miscible_with_water=True,
1093
+ ),
1094
+ "mek": Solvent(
1095
+ name="Methyl ethyl ketone (2-butanone)", formula="CH3COC2H5",
1096
+ bp=79.6, mp=-86.7,
1097
+ density=0.805, dielectric=18.5, polarity_index=4.7,
1098
+ cas="78-93-3", cost_per_L=10, green_score=4,
1099
+ ghs_hazards=["H225", "H319", "H336"],
1100
+ miscible_with_water=True,
1101
+ ),
1102
+ "etoac": Solvent(
1103
+ name="Ethyl acetate", formula="CH3COOC2H5", bp=77.1, mp=-83.6,
1104
+ density=0.902, dielectric=6.0, polarity_index=4.4,
1105
+ cas="141-78-6", cost_per_L=10, green_score=3,
1106
+ ghs_hazards=["H225", "H319", "H336"],
1107
+ miscible_with_water=False,
1108
+ ),
1109
+ "toluene": Solvent(
1110
+ name="Toluene", formula="C6H5CH3", bp=110.6, mp=-95.0,
1111
+ density=0.867, dielectric=2.4, polarity_index=2.4,
1112
+ cas="108-88-3", cost_per_L=10, green_score=5,
1113
+ ghs_hazards=["H225", "H304", "H315", "H336", "H361", "H373"],
1114
+ miscible_with_water=False,
1115
+ ),
1116
+ "benzene": Solvent(
1117
+ name="Benzene", formula="C6H6", bp=80.1, mp=5.5,
1118
+ density=0.879, dielectric=2.3, polarity_index=2.7,
1119
+ cas="71-43-2", cost_per_L=12, green_score=10,
1120
+ ghs_hazards=["H225", "H304", "H315", "H319", "H340", "H350", "H372"],
1121
+ miscible_with_water=False,
1122
+ ),
1123
+ "xylenes": Solvent(
1124
+ name="Xylenes (mixed isomers)", formula="C6H4(CH3)2", bp=139.0, mp=-47.0,
1125
+ density=0.860, dielectric=2.4, polarity_index=2.5,
1126
+ cas="1330-20-7", cost_per_L=10, green_score=6,
1127
+ ghs_hazards=["H226", "H304", "H312", "H315", "H319", "H332", "H335"],
1128
+ miscible_with_water=False,
1129
+ ),
1130
+ "hexanes": Solvent(
1131
+ name="Hexanes", formula="C6H14", bp=69.0, mp=-95.0,
1132
+ density=0.659, dielectric=1.9, polarity_index=0.1,
1133
+ cas="110-54-3", cost_per_L=10, green_score=5,
1134
+ ghs_hazards=["H225", "H304", "H315", "H336", "H361", "H373", "H411"],
1135
+ miscible_with_water=False,
1136
+ ),
1137
+ "pentane": Solvent(
1138
+ name="Pentane", formula="C5H12", bp=36.1, mp=-129.7,
1139
+ density=0.626, dielectric=1.8, polarity_index=0.0,
1140
+ cas="109-66-0", cost_per_L=12, green_score=5,
1141
+ ghs_hazards=["H225", "H304", "H336", "H411"],
1142
+ miscible_with_water=False,
1143
+ ),
1144
+ "heptane": Solvent(
1145
+ name="Heptane", formula="C7H16", bp=98.4, mp=-90.6,
1146
+ density=0.684, dielectric=1.9, polarity_index=0.1,
1147
+ cas="142-82-5", cost_per_L=12, green_score=4,
1148
+ ghs_hazards=["H225", "H304", "H315", "H336", "H411"],
1149
+ miscible_with_water=False,
1150
+ ),
1151
+ "petroleum_ether": Solvent(
1152
+ name="Petroleum ether (40-60)", formula="mixture", bp=50.0, mp=-70.0,
1153
+ density=0.640, dielectric=1.9, polarity_index=0.1,
1154
+ cas="8032-32-4", cost_per_L=8, green_score=5,
1155
+ ghs_hazards=["H225", "H304", "H336", "H411"],
1156
+ miscible_with_water=False,
1157
+ ),
1158
+ "dmf": Solvent(
1159
+ name="N,N-Dimethylformamide", formula="(CH3)2NCHO", bp=153.0, mp=-60.5,
1160
+ density=0.944, dielectric=36.7, polarity_index=6.4,
1161
+ cas="68-12-2", cost_per_L=15, green_score=7,
1162
+ ghs_hazards=["H226", "H312", "H319", "H332", "H360"],
1163
+ miscible_with_water=True,
1164
+ ),
1165
+ "dmso_solvent": Solvent(
1166
+ name="Dimethyl sulfoxide", formula="(CH3)2SO", bp=189.0, mp=19.0,
1167
+ density=1.100, dielectric=46.7, polarity_index=7.2,
1168
+ cas="67-68-5", cost_per_L=12, green_score=4,
1169
+ ghs_hazards=[], miscible_with_water=True,
1170
+ ),
1171
+ "nmp": Solvent(
1172
+ name="N-Methyl-2-pyrrolidone", formula="C5H9NO", bp=202.0, mp=-24.4,
1173
+ density=1.028, dielectric=32.0, polarity_index=6.7,
1174
+ cas="872-50-4", cost_per_L=20, green_score=7,
1175
+ ghs_hazards=["H315", "H319", "H335", "H360"],
1176
+ miscible_with_water=True,
1177
+ ),
1178
+ "dma": Solvent(
1179
+ name="N,N-Dimethylacetamide", formula="CH3CON(CH3)2", bp=165.0, mp=-20.0,
1180
+ density=0.937, dielectric=37.8, polarity_index=6.5,
1181
+ cas="127-19-5", cost_per_L=18, green_score=7,
1182
+ ghs_hazards=["H312", "H332", "H360"],
1183
+ miscible_with_water=True,
1184
+ ),
1185
+ "mecn": Solvent(
1186
+ name="Acetonitrile", formula="CH3CN", bp=81.6, mp=-43.8,
1187
+ density=0.786, dielectric=37.5, polarity_index=5.8,
1188
+ cas="75-05-8", cost_per_L=14, green_score=5,
1189
+ ghs_hazards=["H225", "H302", "H312", "H319", "H332"],
1190
+ miscible_with_water=True,
1191
+ ),
1192
+ "pyridine_solvent": Solvent(
1193
+ name="Pyridine", formula="C5H5N", bp=115.2, mp=-41.6,
1194
+ density=0.982, dielectric=12.4, polarity_index=5.3,
1195
+ cas="110-86-1", cost_per_L=25, green_score=7,
1196
+ ghs_hazards=["H225", "H302", "H312", "H332"],
1197
+ miscible_with_water=True,
1198
+ ),
1199
+ "et3n_solvent": Solvent(
1200
+ name="Triethylamine", formula="(C2H5)3N", bp=88.9, mp=-114.7,
1201
+ density=0.726, dielectric=2.4, polarity_index=1.8,
1202
+ cas="121-44-8", cost_per_L=22, green_score=5,
1203
+ ghs_hazards=["H225", "H302", "H311", "H314", "H331"],
1204
+ miscible_with_water=False,
1205
+ ),
1206
+ "acoh_solvent": Solvent(
1207
+ name="Acetic acid (glacial)", formula="CH3COOH", bp=117.9, mp=16.6,
1208
+ density=1.049, dielectric=6.2, polarity_index=6.0,
1209
+ cas="64-19-7", cost_per_L=12, green_score=4,
1210
+ ghs_hazards=["H226", "H314"], miscible_with_water=True,
1211
+ ),
1212
+ "tfa_solvent": Solvent(
1213
+ name="Trifluoroacetic acid", formula="CF3COOH", bp=72.4, mp=-15.4,
1214
+ density=1.489, dielectric=8.6, polarity_index=5.5,
1215
+ cas="76-05-1", cost_per_L=55, green_score=8,
1216
+ ghs_hazards=["H290", "H314", "H332"],
1217
+ miscible_with_water=True,
1218
+ ),
1219
+ }
1220
+
1221
+
1222
+ # =====================================================================
1223
+ # Lookup helpers
1224
+ # =====================================================================
1225
+
1226
+ def get_reagent(name: str) -> Reagent | None:
1227
+ """Look up a reagent by name or normalised key."""
1228
+ key = normalize_reagent_name(name)
1229
+ return REAGENT_DB.get(key) or REAGENT_DB.get(name)
1230
+
1231
+
1232
+ def get_solvent(name: str) -> Solvent | None:
1233
+ """Look up a solvent by name or normalised key."""
1234
+ key = normalize_reagent_name(name)
1235
+ return SOLVENT_DB.get(key) or SOLVENT_DB.get(name)
1236
+
1237
+
1238
+ def search_reagents(query: str) -> list[Reagent]:
1239
+ """Return all reagents whose name or formula contains *query*."""
1240
+ q = query.lower()
1241
+ return [r for r in REAGENT_DB.values()
1242
+ if q in r.name.lower() or q in r.formula.lower()]
1243
+
1244
+
1245
+ def search_solvents(query: str) -> list[Solvent]:
1246
+ """Return all solvents whose name contains *query*."""
1247
+ q = query.lower()
1248
+ return [s for s in SOLVENT_DB.values() if q in s.name.lower()]