{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn import metrics\n",
    "from sklearn.manifold import TSNE\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "import ase.io\n",
    "import chemiscope\n",
    "from pymatgen.core import Structure, Lattice, Composition\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_json('topoclass.json.gz')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>subset</th>\n",
       "      <th>MAT_TYPE</th>\n",
       "      <th>TQC_TYPE</th>\n",
       "      <th>structure</th>\n",
       "      <th>MP_ID</th>\n",
       "      <th>ICSD_ID</th>\n",
       "      <th>AtomicOrbitals|HOMO_character</th>\n",
       "      <th>AtomicOrbitals|HOMO_element</th>\n",
       "      <th>AtomicOrbitals|HOMO_energy</th>\n",
       "      <th>...</th>\n",
       "      <th>BondFractions|Ho - La bond frac.</th>\n",
       "      <th>BondFractions|Au - Pd bond frac.</th>\n",
       "      <th>BondFractions|Dy - Hg bond frac.</th>\n",
       "      <th>BondFractions|Er - Yb bond frac.</th>\n",
       "      <th>BondFractions|Hg - Tm bond frac.</th>\n",
       "      <th>BondFractions|Er - Hg bond frac.</th>\n",
       "      <th>BondFractions|Be - Sc bond frac.</th>\n",
       "      <th>BondFractions|Hg - Tb bond frac.</th>\n",
       "      <th>BondFractions|Be - Lu bond frac.</th>\n",
       "      <th>BondFractions|Er - Y bond frac.</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>MAT00026906</td>\n",
       "      <td>M/T</td>\n",
       "      <td>TI</td>\n",
       "      <td>None</td>\n",
       "      <td>{'@module': 'pymatgen.core.structure', '@class...</td>\n",
       "      <td>mp-10008</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>20</td>\n",
       "      <td>-0.141411</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>MAT00020270</td>\n",
       "      <td>M/T</td>\n",
       "      <td>TrI</td>\n",
       "      <td>None</td>\n",
       "      <td>{'@module': 'pymatgen.core.structure', '@class...</td>\n",
       "      <td>mp-1001604</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>16</td>\n",
       "      <td>-0.261676</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>MAT00015322</td>\n",
       "      <td>M/T</td>\n",
       "      <td>HSLSM</td>\n",
       "      <td>None</td>\n",
       "      <td>{'@module': 'pymatgen.core.structure', '@class...</td>\n",
       "      <td>mp-1001605</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4</td>\n",
       "      <td>59</td>\n",
       "      <td>-0.155138</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>MAT00025094</td>\n",
       "      <td>M/T</td>\n",
       "      <td>TCI</td>\n",
       "      <td>None</td>\n",
       "      <td>{'@module': 'pymatgen.core.structure', '@class...</td>\n",
       "      <td>mp-1001844</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>7</td>\n",
       "      <td>-0.266297</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>MAT00025479</td>\n",
       "      <td>M/T</td>\n",
       "      <td>HSLSM</td>\n",
       "      <td>None</td>\n",
       "      <td>{'@module': 'pymatgen.core.structure', '@class...</td>\n",
       "      <td>mp-1002220</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>51</td>\n",
       "      <td>-0.185623</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35603</th>\n",
       "      <td>MAT00038674</td>\n",
       "      <td>M&amp;T</td>\n",
       "      <td>TrI</td>\n",
       "      <td>LCEBR</td>\n",
       "      <td>{'@module': 'pymatgen.core.structure', '@class...</td>\n",
       "      <td>mp-696736</td>\n",
       "      <td>28541.0</td>\n",
       "      <td>2</td>\n",
       "      <td>9</td>\n",
       "      <td>-0.415606</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35604</th>\n",
       "      <td>MAT00038675</td>\n",
       "      <td>M&amp;T</td>\n",
       "      <td>TrI</td>\n",
       "      <td>LCEBR</td>\n",
       "      <td>{'@module': 'pymatgen.core.structure', '@class...</td>\n",
       "      <td>mp-707276</td>\n",
       "      <td>20730.0</td>\n",
       "      <td>2</td>\n",
       "      <td>7</td>\n",
       "      <td>-0.266297</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35605</th>\n",
       "      <td>MAT00038676</td>\n",
       "      <td>M&amp;T</td>\n",
       "      <td>TrI</td>\n",
       "      <td>LCEBR</td>\n",
       "      <td>{'@module': 'pymatgen.core.structure', '@class...</td>\n",
       "      <td>mp-707334</td>\n",
       "      <td>67509.0</td>\n",
       "      <td>2</td>\n",
       "      <td>8</td>\n",
       "      <td>-0.338381</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35606</th>\n",
       "      <td>MAT00038677</td>\n",
       "      <td>M&amp;T</td>\n",
       "      <td>TrI</td>\n",
       "      <td>LCEBR</td>\n",
       "      <td>{'@module': 'pymatgen.core.structure', '@class...</td>\n",
       "      <td>mp-707897</td>\n",
       "      <td>59327.0</td>\n",
       "      <td>2</td>\n",
       "      <td>8</td>\n",
       "      <td>-0.338381</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35607</th>\n",
       "      <td>MAT00038678</td>\n",
       "      <td>M&amp;T</td>\n",
       "      <td>TrI</td>\n",
       "      <td>LCEBR</td>\n",
       "      <td>{'@module': 'pymatgen.core.structure', '@class...</td>\n",
       "      <td>mp-9198</td>\n",
       "      <td>79005.0</td>\n",
       "      <td>2</td>\n",
       "      <td>15</td>\n",
       "      <td>-0.206080</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>35608 rows × 4717 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                ID subset MAT_TYPE TQC_TYPE  \\\n",
       "0      MAT00026906    M/T       TI     None   \n",
       "1      MAT00020270    M/T      TrI     None   \n",
       "2      MAT00015322    M/T    HSLSM     None   \n",
       "3      MAT00025094    M/T      TCI     None   \n",
       "4      MAT00025479    M/T    HSLSM     None   \n",
       "...            ...    ...      ...      ...   \n",
       "35603  MAT00038674    M&T      TrI    LCEBR   \n",
       "35604  MAT00038675    M&T      TrI    LCEBR   \n",
       "35605  MAT00038676    M&T      TrI    LCEBR   \n",
       "35606  MAT00038677    M&T      TrI    LCEBR   \n",
       "35607  MAT00038678    M&T      TrI    LCEBR   \n",
       "\n",
       "                                               structure       MP_ID  ICSD_ID  \\\n",
       "0      {'@module': 'pymatgen.core.structure', '@class...    mp-10008      NaN   \n",
       "1      {'@module': 'pymatgen.core.structure', '@class...  mp-1001604      NaN   \n",
       "2      {'@module': 'pymatgen.core.structure', '@class...  mp-1001605      NaN   \n",
       "3      {'@module': 'pymatgen.core.structure', '@class...  mp-1001844      NaN   \n",
       "4      {'@module': 'pymatgen.core.structure', '@class...  mp-1002220      NaN   \n",
       "...                                                  ...         ...      ...   \n",
       "35603  {'@module': 'pymatgen.core.structure', '@class...   mp-696736  28541.0   \n",
       "35604  {'@module': 'pymatgen.core.structure', '@class...   mp-707276  20730.0   \n",
       "35605  {'@module': 'pymatgen.core.structure', '@class...   mp-707334  67509.0   \n",
       "35606  {'@module': 'pymatgen.core.structure', '@class...   mp-707897  59327.0   \n",
       "35607  {'@module': 'pymatgen.core.structure', '@class...     mp-9198  79005.0   \n",
       "\n",
       "       AtomicOrbitals|HOMO_character  AtomicOrbitals|HOMO_element  \\\n",
       "0                                  1                           20   \n",
       "1                                  2                           16   \n",
       "2                                  4                           59   \n",
       "3                                  2                            7   \n",
       "4                                  2                           51   \n",
       "...                              ...                          ...   \n",
       "35603                              2                            9   \n",
       "35604                              2                            7   \n",
       "35605                              2                            8   \n",
       "35606                              2                            8   \n",
       "35607                              2                           15   \n",
       "\n",
       "       AtomicOrbitals|HOMO_energy  ...  BondFractions|Ho - La bond frac.  \\\n",
       "0                       -0.141411  ...                                 0   \n",
       "1                       -0.261676  ...                                 0   \n",
       "2                       -0.155138  ...                                 0   \n",
       "3                       -0.266297  ...                                 0   \n",
       "4                       -0.185623  ...                                 0   \n",
       "...                           ...  ...                               ...   \n",
       "35603                   -0.415606  ...                                 0   \n",
       "35604                   -0.266297  ...                                 0   \n",
       "35605                   -0.338381  ...                                 0   \n",
       "35606                   -0.338381  ...                                 0   \n",
       "35607                   -0.206080  ...                                 0   \n",
       "\n",
       "       BondFractions|Au - Pd bond frac.  BondFractions|Dy - Hg bond frac.  \\\n",
       "0                                     0                                 0   \n",
       "1                                     0                                 0   \n",
       "2                                     0                                 0   \n",
       "3                                     0                                 0   \n",
       "4                                     0                                 0   \n",
       "...                                 ...                               ...   \n",
       "35603                                 0                                 0   \n",
       "35604                                 0                                 0   \n",
       "35605                                 0                                 0   \n",
       "35606                                 0                                 0   \n",
       "35607                                 0                                 0   \n",
       "\n",
       "       BondFractions|Er - Yb bond frac.  BondFractions|Hg - Tm bond frac.  \\\n",
       "0                                     0                                 0   \n",
       "1                                     0                                 0   \n",
       "2                                     0                                 0   \n",
       "3                                     0                                 0   \n",
       "4                                     0                                 0   \n",
       "...                                 ...                               ...   \n",
       "35603                                 0                                 0   \n",
       "35604                                 0                                 0   \n",
       "35605                                 0                                 0   \n",
       "35606                                 0                                 0   \n",
       "35607                                 0                                 0   \n",
       "\n",
       "       BondFractions|Er - Hg bond frac.  BondFractions|Be - Sc bond frac.  \\\n",
       "0                                     0                               0.0   \n",
       "1                                     0                               0.0   \n",
       "2                                     0                               0.0   \n",
       "3                                     0                               0.0   \n",
       "4                                     0                               0.0   \n",
       "...                                 ...                               ...   \n",
       "35603                                 0                               0.0   \n",
       "35604                                 0                               0.0   \n",
       "35605                                 0                               0.0   \n",
       "35606                                 0                               0.0   \n",
       "35607                                 0                               0.0   \n",
       "\n",
       "       BondFractions|Hg - Tb bond frac.  BondFractions|Be - Lu bond frac.  \\\n",
       "0                                     0                               0.0   \n",
       "1                                     0                               0.0   \n",
       "2                                     0                               0.0   \n",
       "3                                     0                               0.0   \n",
       "4                                     0                               0.0   \n",
       "...                                 ...                               ...   \n",
       "35603                                 0                               0.0   \n",
       "35604                                 0                               0.0   \n",
       "35605                                 0                               0.0   \n",
       "35606                                 0                               0.0   \n",
       "35607                                 0                               0.0   \n",
       "\n",
       "       BondFractions|Er - Y bond frac.  \n",
       "0                                    0  \n",
       "1                                    0  \n",
       "2                                    0  \n",
       "3                                    0  \n",
       "4                                    0  \n",
       "...                                ...  \n",
       "35603                                0  \n",
       "35604                                0  \n",
       "35605                                0  \n",
       "35606                                0  \n",
       "35607                                0  \n",
       "\n",
       "[35608 rows x 4717 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "classes = {\"TrI\": 0, \"NTM\": 1, \"TI\": 2, \"TCI\": 3, \"HSPSM\": 4, \"HSLSM\": 5}\n",
    "mpe = \"MaximumPackingEfficiency|max packing efficiency\"\n",
    "fpv = \"ValenceOrbital|frac p valence electrons\"\n",
    "deltaH = \"Miedema|Miedema_deltaH_inter\"\n",
    "mat_type = \"MAT_TYPE\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = df[[mpe,fpv]].values\n",
    "X_scaled = StandardScaler().fit_transform(X)\n",
    "tsne = TSNE(n_components=2, init='pca', random_state=0)\n",
    "X_tsne = tsne.fit_transform(X_scaled)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "df[\"tSNE_1\"]=X_tsne[:,0]\n",
    "df[\"tSNE_2\"]=X_tsne[:,1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay at 0x10deab7d0>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "actual = (df[mat_type] == \"TrI\")\n",
    "predicted = (df[\"tSNE_1\"] > 0)\n",
    "confusion_matrix = metrics.confusion_matrix(actual, predicted)\n",
    "#TP = confusion_matrix[0,0]\n",
    "#FP = confusion_matrix[1,0]\n",
    "#FN = confusion_matrix[0,1]\n",
    "#TN = confusion_matrix[1,1]\n",
    "metrics.ConfusionMatrixDisplay(confusion_matrix = confusion_matrix, display_labels = [\"NTM\", \"TrI\"]).plot(values_format='')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy:  0.7575544821388452\n",
      "Precision: 0.9218279209909608\n",
      "Recall:    0.6955331958068455\n",
      "F1:        0.7928494301139772\n"
     ]
    }
   ],
   "source": [
    "print(\"Accuracy: \", metrics.accuracy_score(actual, predicted))\n",
    "print(\"Precision:\", metrics.precision_score(actual, predicted))\n",
    "print(\"Recall:   \", metrics.recall_score(actual, predicted))\n",
    "print(\"F1:       \", metrics.f1_score(actual, predicted))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "frames = []\n",
    "for ind, row in df.iterrows():\n",
    "    struc = Structure.from_dict(row[\"structure\"])\n",
    "    atoms = struc.to_ase_atoms()\n",
    "    atoms.info = {\n",
    "        \"mat_id\": ind,\n",
    "        \"mpe\": row[mpe],\n",
    "        \"fpv\": row[fpv],\n",
    "        \"deltaH\": row[deltaH],\n",
    "        \"tSNE_1\": -row[\"tSNE_1\"],\n",
    "        \"tSNE_2\": row[\"tSNE_2\"],\n",
    "        \"mat_type_2\": int(classes[row[mat_type]]>0),\n",
    "        \"mat_type_5\": classes[row[mat_type]]\n",
    "        }\n",
    "    frames.append(atoms)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "12a880bd4e41427b96a35cd5e0876bbc",
       "version_major": 2,
       "version_minor": 0
      },
      "text/html": [
       "<ChemiscopeWidget(meta={'name': 'Topological classification'}, settings={'map': {'x': {'property': 'tSNE_1'}, 'y': {'property': 'tSNE_2'...}, structures=[{'size': 8, 'names': ['Ca', 'Ca', 'Ca', 'Ca', 'Ca', 'Ca', 'Ca',...}, properties={'mat_type_5': {'target': 'structure', 'values': [2.0, 0.0, 5.0,...}, )>"
      ],
      "text/plain": [
       "<ChemiscopeWidget(meta={'name': 'Topological classification'}, settings={'map': {'x': {'property': 'tSNE_1'}, …"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "settings = chemiscope.quick_settings(x=\"tSNE_1\", y=\"tSNE_2\", color=\"mat_type_2\")\n",
    "settings[\"map\"][\"palette\"]=\"viridis\"\n",
    "chemiscope.show(\n",
    "    frames=frames,\n",
    "    properties=chemiscope.extract_properties(frames),\n",
    "    meta=dict(name=\"Topological classification\"),\n",
    "    settings=settings,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "chemiscope.write_input(\n",
    "    \"topoclass.chemiscope.json\",\n",
    "    frames=frames,\n",
    "    properties=chemiscope.extract_properties(frames),\n",
    "    meta=dict(name=\"Topological classification\"),\n",
    "    settings=settings,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "chemiscope_env",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
