|
46 | 46 | "FOLDER_PATH = \"./uploads\"\n", |
47 | 47 | "\n", |
48 | 48 | "# By default, format will be guessed from file extension\n", |
49 | | - "# If set to specific format, notebook will only read that format\n", |
50 | | - "ENFORCED_FORMATS = None # e.g. [\"cif\", \"espresso-in\"]\n", |
| 49 | + "# If set to specific format, or array of formats, notebook will only read that format\n", |
| 50 | + "ENFORCED_FORMATS = None # e.g. \"cif\" or [\"cif\", \"espresso-in\"]\n", |
51 | 51 | "\n", |
52 | 52 | "# If set to true, the file extension will be included in the resulting material name\n", |
53 | 53 | "USE_FILE_NAME_NO_EXTENSION = False\n", |
|
72 | 72 | "outputs": [], |
73 | 73 | "source": [ |
74 | 74 | "import sys\n", |
| 75 | + "\n", |
75 | 76 | "if sys.platform == \"emscripten\":\n", |
76 | 77 | " import micropip\n", |
| 78 | + "\n", |
77 | 79 | " await micropip.install(\"mat3ra-api-examples\", deps=False)\n", |
78 | 80 | " await micropip.install('mat3ra-utils')\n", |
79 | 81 | " from mat3ra.utils.jupyterlite.packages import install_packages\n", |
| 82 | + "\n", |
80 | 83 | " await install_packages(\"import_materials_from_files.ipynb\")" |
81 | 84 | ] |
82 | 85 | }, |
|
101 | 104 | "from pathlib import Path\n", |
102 | 105 | "from ase.io import read\n", |
103 | 106 | "\n", |
104 | | - "ase_atoms, readable_file_names, unreadable_file_names = [], [], []\n", |
| 107 | + "ase_atoms_list, readable_file_names, unreadable_file_names = [], [], []\n", |
105 | 108 | "file_names = os.listdir(FOLDER_PATH)\n", |
106 | 109 | "\n", |
107 | 110 | "for file_name in file_names:\n", |
108 | 111 | " file_path = os.path.join(FOLDER_PATH, file_name)\n", |
109 | | - " formats = ENFORCED_FORMATS or [None]\n", |
| 112 | + " formats = [ENFORCED_FORMATS] if isinstance(ENFORCED_FORMATS, str) else ENFORCED_FORMATS or [None]\n", |
110 | 113 | "\n", |
111 | 114 | " for fmt in formats:\n", |
112 | 115 | " try:\n", |
113 | 116 | " atoms = read(file_path, format=fmt)\n", |
114 | 117 | " atoms.info[\"file_name\"] = Path(file_name).stem if USE_FILE_NAME_NO_EXTENSION else file_name\n", |
115 | | - " ase_atoms.append(atoms)\n", |
| 118 | + " ase_atoms_list.append(atoms)\n", |
116 | 119 | " readable_file_names.append(file_name)\n", |
117 | 120 | " print(\"Successfully read:\", atoms.info[\"file_name\"], \"using format:\", fmt)\n", |
118 | 121 | " break\n", |
|
138 | 141 | "metadata": {}, |
139 | 142 | "outputs": [], |
140 | 143 | "source": [ |
141 | | - "print(f\"Successfully read {len(ase_atoms)} files: {readable_file_names}. \")\n", |
| 144 | + "print(f\"Successfully read {len(ase_atoms_list)} files: {readable_file_names}. \")\n", |
142 | 145 | "print(f\"Unreadable files: {unreadable_file_names}. \")" |
143 | 146 | ] |
144 | 147 | }, |
|
182 | 185 | "metadata": {}, |
183 | 186 | "outputs": [], |
184 | 187 | "source": [ |
185 | | - "import io\n", |
186 | | - "from ase import Atoms\n", |
187 | | - "from ase.io import write\n", |
188 | | - "from express import ExPrESS\n", |
189 | | - "\n", |
190 | | - "def ase_to_poscar(atoms: Atoms):\n", |
191 | | - " output = io.StringIO()\n", |
192 | | - " try:\n", |
193 | | - " write(output, atoms, format=\"vasp\")\n", |
194 | | - " content = output.getvalue()\n", |
195 | | - " except Exception as e:\n", |
196 | | - " print(f\"Error converting ASE atoms to POSCAR: {e}\")\n", |
197 | | - " content = None\n", |
198 | | - " finally:\n", |
199 | | - " output.close()\n", |
200 | | - "\n", |
201 | | - " return content\n", |
202 | | - "\n", |
203 | | - "def convert_ase_entry_to_esse(ase_entry):\n", |
204 | | - " try:\n", |
205 | | - " poscar = ase_to_poscar(ase_entry)\n", |
206 | | - " if poscar is None:\n", |
207 | | - " raise ValueError(\"Failed to generate POSCAR string\")\n", |
208 | | - "\n", |
209 | | - " kwargs = {\n", |
210 | | - " \"structure_string\": poscar,\n", |
211 | | - " \"structure_format\": \"poscar\"\n", |
212 | | - " }\n", |
213 | | - "\n", |
214 | | - " handler = ExPrESS(\"structure\", **kwargs)\n", |
215 | | - " esse = handler.property(\"material\", **kwargs)\n", |
216 | | - "\n", |
217 | | - " esse[\"name\"] = ase_entry.info.get(\"file_name\", \"Unknown\")\n", |
218 | | - "\n", |
219 | | - " return esse\n", |
220 | | - " except Exception as e:\n", |
221 | | - " print(f\"Error processing ASE entry: {e}\")\n", |
222 | | - " return None\n", |
| 188 | + "from mat3ra.made.tools.convert import from_ase\n", |
223 | 189 | "\n", |
224 | | - "esse_entries = [entry for entry in map(convert_ase_entry_to_esse, ase_atoms) if entry is not None]" |
| 190 | + "esse_entries = [from_ase(ase_atoms) for ase_atoms in ase_atoms_list]" |
225 | 191 | ] |
226 | 192 | }, |
227 | 193 | { |
|
0 commit comments