{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":87793,"databundleVersionId":11403143,"sourceType":"competition"},{"sourceId":6233380,"sourceType":"datasetVersion","datasetId":3580819},{"sourceId":7395079,"sourceType":"datasetVersion","datasetId":4299455},{"sourceId":7639698,"sourceType":"datasetVersion","datasetId":4299272},{"sourceId":10878276,"sourceType":"datasetVersion","datasetId":6758842},{"sourceId":10878463,"sourceType":"datasetVersion","datasetId":6759157},{"sourceId":10880297,"sourceType":"datasetVersion","datasetId":6760419},{"sourceId":10880353,"sourceType":"datasetVersion","datasetId":6760463},{"sourceId":10880374,"sourceType":"datasetVersion","datasetId":6760482},{"sourceId":10880419,"sourceType":"datasetVersion","datasetId":6760509},{"sourceId":224703571,"sourceType":"kernelVersion"}],"dockerImageVersionId":30919,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# RhoFold + RibonanzaNet ","metadata":{}},{"cell_type":"markdown","source":"## Credit goes to this notebook and this author https://www.kaggle.com/code/ogurtsov/rhofold-ribonanzanet-msas-lb-0-215 \n\n## LR from 1e-5 = 0.00001 to 0.00008646636\n\n## Follow other works and here Kaggle AI Model usages Deepseek automated coding, Google Gemini API for generated code optimizations,deepseek's free text to sql here --> https://www.kaggle.com/organizations/andrometocs ","metadata":{}},{"cell_type":"markdown","source":"This notebook combines predictions from [LB 0.179 RNA 3D LR adjusted](https://www.kaggle.com/code/kumarandatascientist/lb-0-179-rna-3d-lr-adjusted) for long (>400 residuals) RNA and [RhoFold](https://github.com/ml4bio/RhoFold) predictions for short (<=400 residuals) RNA. \n\nIt seems like RhoFold makes better predictions but runs OOM for long sequences. \n\nPossible fix is to make inference on CPU; I have tried it successfully in public test and got notebook scoring forever on LB (Notebook Timeout error).\n\nPlease note that only 1 relaxation step is performed in the current version.\n\nThe main topics I want to illustrate here is how to run RhoFold on Kaggle and how to combine predictions from different models.\n\nUPD: \n\n* 0 relaxation steps\n\n* add MSAs from `/kaggle/input/stanford-rna-3d-folding/MSA`","metadata":{}},{"cell_type":"markdown","source":"# RibonanzaNet 3D Inference","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport torch\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport torch\nimport random\nimport pickle","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:07:27.750733Z","iopub.execute_input":"2025-03-02T15:07:27.751056Z","iopub.status.idle":"2025-03-02T15:07:31.320759Z","shell.execute_reply.started":"2025-03-02T15:07:27.751027Z","shell.execute_reply":"2025-03-02T15:07:31.319872Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"config = {\n    \"seed\": 0,\n    \"cutoff_date\": \"2020-01-01\",\n    \"test_cutoff_date\": \"2022-05-01\",\n    \"max_len\": 384,\n    \"batch_size\": 4,\n    \"learning_rate\": 0.00008646636,\n    \"weight_decay\": 0.0,\n    \"mixed_precision\": \"bf16\",\n    \"model_config_path\": \"../working/configs/pairwise.yaml\",  # Adjust path as needed\n    \"epochs\": 30,\n    \"cos_epoch\": 5,\n    \"loss_power_scale\": 1.0,\n    \"max_cycles\": 1,\n    \"grad_clip\": 0.1,\n    \"gradient_accumulation_steps\": 1,\n    \"d_clamp\": 30,\n    \"max_len_filter\": 9999999,\n    \"structural_violation_epoch\": 50,\n    \"balance_weight\": False,\n}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:07:31.321994Z","iopub.execute_input":"2025-03-02T15:07:31.322458Z","iopub.status.idle":"2025-03-02T15:07:31.326348Z","shell.execute_reply.started":"2025-03-02T15:07:31.322424Z","shell.execute_reply":"2025-03-02T15:07:31.325503Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data=pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/test_sequences.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:08:12.598005Z","iopub.execute_input":"2025-03-02T15:08:12.598317Z","iopub.status.idle":"2025-03-02T15:08:12.61375Z","shell.execute_reply.started":"2025-03-02T15:08:12.598293Z","shell.execute_reply":"2025-03-02T15:08:12.612901Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader\n\nclass RNADataset(Dataset):\n    def __init__(self,data):\n        self.data=data\n        self.tokens={nt:i for i,nt in enumerate('ACGU')}\n\n    def __len__(self):\n        return len(self.data)\n    \n    def __getitem__(self, idx):\n        sequence=[self.tokens[nt] for nt in (self.data.loc[idx,'sequence'])]\n        sequence=np.array(sequence)\n        sequence=torch.tensor(sequence)\n\n\n\n\n        return {'sequence':sequence}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:08:21.108873Z","iopub.execute_input":"2025-03-02T15:08:21.109183Z","iopub.status.idle":"2025-03-02T15:08:21.114796Z","shell.execute_reply.started":"2025-03-02T15:08:21.109157Z","shell.execute_reply":"2025-03-02T15:08:21.114009Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_dataset=RNADataset(test_data)\ntest_dataset[0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:08:28.245583Z","iopub.execute_input":"2025-03-02T15:08:28.245886Z","iopub.status.idle":"2025-03-02T15:08:28.290508Z","shell.execute_reply.started":"2025-03-02T15:08:28.24586Z","shell.execute_reply":"2025-03-02T15:08:28.289663Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sys\n\nsys.path.append(\"/kaggle/input/ribonanzanet2d-final\")\n\n\nfrom Network import *\nimport yaml\n\n\n\nclass Config:\n    def __init__(self, **entries):\n        self.__dict__.update(entries)\n        self.entries=entries\n\n    def print(self):\n        print(self.entries)\n\ndef load_config_from_yaml(file_path):\n    with open(file_path, 'r') as file:\n        config = yaml.safe_load(file)\n    return Config(**config)\n\nclass finetuned_RibonanzaNet(RibonanzaNet):\n    def __init__(self, config, pretrained=False):\n        config.dropout=0.2\n        super(finetuned_RibonanzaNet, self).__init__(config)\n        if pretrained:\n            self.load_state_dict(torch.load(\"/kaggle/input/ribonanzanet-weights/RibonanzaNet.pt\",map_location='cpu'))\n        # self.ct_predictor=nn.Sequential(nn.Linear(64,256),\n        #                                 nn.ReLU(),\n        #                                 nn.Linear(256,64),\n        #                                 nn.ReLU(),\n        #                                 nn.Linear(64,1)) \n        self.dropout=nn.Dropout(0.0)\n        self.xyz_predictor=nn.Linear(256,3)\n\n    def forward(self,src):\n        \n        #with torch.no_grad():\n        sequence_features, pairwise_features=self.get_embeddings(src, torch.ones_like(src).long().to(src.device))\n\n        xyz=self.xyz_predictor(sequence_features)\n\n        return xyz","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:08:40.416275Z","iopub.execute_input":"2025-03-02T15:08:40.416574Z","iopub.status.idle":"2025-03-02T15:08:42.269208Z","shell.execute_reply.started":"2025-03-02T15:08:40.416547Z","shell.execute_reply":"2025-03-02T15:08:42.268323Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model=finetuned_RibonanzaNet(load_config_from_yaml(\"/kaggle/input/ribonanzanet2d-final/configs/pairwise.yaml\"),pretrained=False).cuda()\n\nmodel.load_state_dict(torch.load(\"/kaggle/input/ribonanzanet-3d-finetune/RibonanzaNet-3D.pt\"))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:08:47.968697Z","iopub.execute_input":"2025-03-02T15:08:47.969157Z","iopub.status.idle":"2025-03-02T15:08:49.054197Z","shell.execute_reply.started":"2025-03-02T15:08:47.969131Z","shell.execute_reply":"2025-03-02T15:08:49.053096Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_dataset[0]['sequence'].shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:08:56.571826Z","iopub.execute_input":"2025-03-02T15:08:56.572128Z","iopub.status.idle":"2025-03-02T15:08:56.577321Z","shell.execute_reply.started":"2025-03-02T15:08:56.572105Z","shell.execute_reply":"2025-03-02T15:08:56.576522Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.eval()\npreds=[]\nfor i in range(len(test_dataset)):\n    src=test_dataset[i]['sequence'].long()\n    src=src.unsqueeze(0).cuda()\n\n    model.train()\n\n    tmp=[]\n    for i in range(4):\n        with torch.no_grad():\n            xyz=model(src).squeeze()\n        tmp.append(xyz.cpu().numpy())\n\n    model.eval()\n    with torch.no_grad():\n        xyz=model(src).squeeze()\n    tmp.append(xyz.cpu().numpy())\n\n    tmp=np.stack(tmp,0)\n    #exit()\n    preds.append(tmp)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:09:04.403335Z","iopub.execute_input":"2025-03-02T15:09:04.403633Z","iopub.status.idle":"2025-03-02T15:09:26.269449Z","shell.execute_reply.started":"2025-03-02T15:09:04.40361Z","shell.execute_reply":"2025-03-02T15:09:26.268528Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import plotly.graph_objects as go\nimport numpy as np\n\n# Example: Generate an Nx3 matrix\n\nxyz = preds[7][0]  # Replace this with your actual Nx3 data\nN = len(xyz)\n\n# Extract columns\nx, y, z = xyz[:, 0], xyz[:, 1], xyz[:, 2]\n\n# Create the 3D scatter plot\nfig = go.Figure(data=[go.Scatter3d(\n    x=x, y=y, z=z,\n    mode='markers',\n    marker=dict(\n        size=5,\n        color=z,  # Coloring based on z-value\n        colorscale='Viridis',  # Choose a colorscale\n        opacity=0.8\n    )\n)])\n\n# Customize layout\nfig.update_layout(\n    scene=dict(\n        xaxis_title=\"X\",\n        yaxis_title=\"Y\",\n        zaxis_title=\"Z\"\n    ),\n    title=\"3D Scatter Plot\"\n)\n\n# Show figure\nfig.show(renderer='iframe')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:09:33.238039Z","iopub.execute_input":"2025-03-02T15:09:33.23832Z","iopub.status.idle":"2025-03-02T15:09:33.861344Z","shell.execute_reply.started":"2025-03-02T15:09:33.238297Z","shell.execute_reply":"2025-03-02T15:09:33.860618Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ID=[]\nresname=[]\nresid=[]\nx=[]\ny=[]\nz=[]\n\ndata=[]\n\nfor i in range(len(test_data)):\n    #print(test_data.loc[i])\n\n    \n    for j in range(len(test_data.loc[i,'sequence'])):\n        # ID.append(test_data.loc[i,'sequence_id']+f\"_{j+1}\")\n        # resname.append(test_data.loc[i,'sequence'][j])\n        # resid.append(j+1) # 1 indexed\n        row=[test_data.loc[i,'target_id']+f\"_{j+1}\",\n             test_data.loc[i,'sequence'][j],\n             j+1]\n\n        for k in range(5):\n            for kk in range(3):\n                row.append(preds[i][k][j][kk])\n        data.append(row)\n\ncolumns=['ID','resname','resid']\nfor i in range(1,6):\n    columns+=[f\"x_{i}\"]\n    columns+=[f\"y_{i}\"]\n    columns+=[f\"z_{i}\"]\n\n\nsubmission_ribonanza_net = pd.DataFrame(data,columns=columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:10:13.115339Z","iopub.execute_input":"2025-03-02T15:10:13.115685Z","iopub.status.idle":"2025-03-02T15:10:13.194891Z","shell.execute_reply.started":"2025-03-02T15:10:13.115658Z","shell.execute_reply":"2025-03-02T15:10:13.194251Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nimport sys\nimport argparse","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:11.016844Z","iopub.execute_input":"2025-03-04T14:40:11.017212Z","iopub.status.idle":"2025-03-04T14:40:11.450273Z","shell.execute_reply.started":"2025-03-04T14:40:11.017178Z","shell.execute_reply":"2025-03-04T14:40:11.449333Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install /kaggle/input/openmm/OpenMM-8.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:11.45137Z","iopub.execute_input":"2025-03-04T14:40:11.451846Z","iopub.status.idle":"2025-03-04T14:40:17.797463Z","shell.execute_reply.started":"2025-03-04T14:40:11.451812Z","shell.execute_reply":"2025-03-04T14:40:17.796428Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install /kaggle/input/simtk-0-1/simtk-0.1.0-py2.py3-none-any.whl","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:17.799379Z","iopub.execute_input":"2025-03-04T14:40:17.799658Z","iopub.status.idle":"2025-03-04T14:40:21.137918Z","shell.execute_reply.started":"2025-03-04T14:40:17.799634Z","shell.execute_reply":"2025-03-04T14:40:21.137114Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install /kaggle/input/pytest-runner/pytest_runner-6.0.1-py3-none-any.whl","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:21.139187Z","iopub.execute_input":"2025-03-04T14:40:21.139419Z","iopub.status.idle":"2025-03-04T14:40:24.785959Z","shell.execute_reply.started":"2025-03-04T14:40:21.139397Z","shell.execute_reply":"2025-03-04T14:40:24.785057Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install /kaggle/input/biopython/biopython-1.85-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:24.786962Z","iopub.execute_input":"2025-03-04T14:40:24.787228Z","iopub.status.idle":"2025-03-04T14:40:29.23986Z","shell.execute_reply.started":"2025-03-04T14:40:24.787195Z","shell.execute_reply":"2025-03-04T14:40:29.239025Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install /kaggle/input/ml-collections/ml_collections-1.0.0-py3-none-any.whl","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:29.240865Z","iopub.execute_input":"2025-03-04T14:40:29.241208Z","iopub.status.idle":"2025-03-04T14:40:32.789748Z","shell.execute_reply.started":"2025-03-04T14:40:29.241174Z","shell.execute_reply":"2025-03-04T14:40:32.788699Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!cp -R /kaggle/input/rhofold-repo /kaggle/working/","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:32.817278Z","iopub.execute_input":"2025-03-04T14:40:32.817469Z","iopub.status.idle":"2025-03-04T14:40:37.908944Z","shell.execute_reply.started":"2025-03-04T14:40:32.817451Z","shell.execute_reply":"2025-03-04T14:40:37.908006Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!mv rhofold-repo RhoFold","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:37.909882Z","iopub.execute_input":"2025-03-04T14:40:37.910145Z","iopub.status.idle":"2025-03-04T14:40:38.03331Z","shell.execute_reply.started":"2025-03-04T14:40:37.91012Z","shell.execute_reply":"2025-03-04T14:40:38.032477Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cd /kaggle/working/RhoFold","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:38.034179Z","iopub.execute_input":"2025-03-04T14:40:38.034447Z","iopub.status.idle":"2025-03-04T14:40:38.041989Z","shell.execute_reply.started":"2025-03-04T14:40:38.034413Z","shell.execute_reply":"2025-03-04T14:40:38.041084Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!python setup.py install","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:40:38.042835Z","iopub.execute_input":"2025-03-04T14:40:38.043101Z","iopub.status.idle":"2025-03-04T14:41:44.052697Z","shell.execute_reply.started":"2025-03-04T14:40:38.04308Z","shell.execute_reply":"2025-03-04T14:41:44.05163Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fasta = pd.read_csv(\"/kaggle/input/stanford-rna-3d-folding/test_sequences.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:41:44.184444Z","iopub.execute_input":"2025-03-04T14:41:44.184736Z","iopub.status.idle":"2025-03-04T14:41:44.221541Z","shell.execute_reply.started":"2025-03-04T14:41:44.184708Z","shell.execute_reply":"2025-03-04T14:41:44.220963Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fasta","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:41:44.222203Z","iopub.execute_input":"2025-03-04T14:41:44.222406Z","iopub.status.idle":"2025-03-04T14:41:44.249888Z","shell.execute_reply.started":"2025-03-04T14:41:44.222387Z","shell.execute_reply":"2025-03-04T14:41:44.249296Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!mkdir test_fasta\n!mkdir out","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:41:44.250519Z","iopub.execute_input":"2025-03-04T14:41:44.250724Z","iopub.status.idle":"2025-03-04T14:41:44.482933Z","shell.execute_reply.started":"2025-03-04T14:41:44.250704Z","shell.execute_reply":"2025-03-04T14:41:44.481876Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for target_id in fasta[\"target_id\"].values:\n    with open(f\"test_fasta/{target_id}.fasta\", \"w\") as text_file:\n        text_file.write(\">100500\\n\")\n        text_file.write(\n            fasta.loc[fasta[\"target_id\"] == target_id, [\"sequence\"]].to_string(index = False, header = False)\n        )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T14:41:44.484015Z","iopub.execute_input":"2025-03-04T14:41:44.484343Z","iopub.status.idle":"2025-03-04T14:41:44.516934Z","shell.execute_reply.started":"2025-03-04T14:41:44.48431Z","shell.execute_reply":"2025-03-04T14:41:44.516304Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for target_id in fasta[\"target_id\"].values:\n    os.makedirs(f\"./out/{target_id}\", exist_ok = True)\n    a3m_file = f\"/kaggle/input/stanford-rna-3d-folding/MSA/{target_id}.MSA.fasta\"\n    fasta_file = f\"/kaggle/working/RhoFold/test_fasta/{target_id}.fasta\"\n    if len(open(fasta_file, 'r').read()) > 400:\n        continue\n    device = \"cpu\" if len(open(fasta_file, 'r').read()) > 400 else \"cuda:0\"\n    run_folding = f\"python inference.py --relax_steps 0 --input_fas {fasta_file} --input_a3m {a3m_file} --output_dir ./out/{target_id}/ --device {device} --ckpt ./pretrained/RhoFold_pretrained.pt\"\n    os.system(run_folding)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T15:41:34.977346Z","iopub.execute_input":"2025-03-04T15:41:34.977652Z","iopub.status.idle":"2025-03-04T15:41:34.984648Z","shell.execute_reply.started":"2025-03-04T15:41:34.977621Z","shell.execute_reply":"2025-03-04T15:41:34.98295Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def extract_c1_coordinates(pdb_file):\n    # Create a PDB parser object\n    parser = PDBParser()\n    \n    # Load the structure from the PDB file\n    structure = parser.get_structure('RNA_structure', pdb_file)\n    \n    # Initialize a list to store the coordinates of C1' atoms\n    c1_coordinates = []\n    \n    # Iterate over all models in the structure (usually only one model)\n    for model in structure:\n        # Iterate over all chains in the model\n        for chain in model:\n            # Iterate over all residues in the chain\n            for residue in chain:\n                # Check if the residue is an RNA nucleotide\n                if residue.get_resname() in ['A', 'U', 'G', 'C']:\n                    # Try to get the C1' atom\n                    try:\n                        c1_atom = residue['C1\\'']\n                        # Append the coordinates of the C1' atom to the list\n                        c1_coordinates.append((residue.get_resname(), c1_atom.get_coord()))\n                    except KeyError:\n                        # If C1' atom is not found, skip this residue\n                        print(f\"C1' atom not found in residue {residue.get_resname()}{residue.get_id()[1]}\")\n    \n    return c1_coordinates\n\n# (c) DeepSeek","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T15:08:55.9178Z","iopub.execute_input":"2025-03-04T15:08:55.918044Z","iopub.status.idle":"2025-03-04T15:08:55.922653Z","shell.execute_reply.started":"2025-03-04T15:08:55.918024Z","shell.execute_reply":"2025-03-04T15:08:55.92187Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from pathlib import Path\nfrom Bio.PDB import PDBParser","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T15:08:57.729469Z","iopub.execute_input":"2025-03-04T15:08:57.729847Z","iopub.status.idle":"2025-03-04T15:08:57.733575Z","shell.execute_reply.started":"2025-03-04T15:08:57.729818Z","shell.execute_reply":"2025-03-04T15:08:57.732699Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"subm = []\nfor target_id in fasta[\"target_id\"].values:\n    fasta_file = f\"/kaggle/working/RhoFold/test_fasta/{target_id}.fasta\"    \n    if len(open(fasta_file, 'r').read()) > 400:\n        continue\n    pdb_file = f\"/kaggle/working/RhoFold/out/{target_id}/unrelaxed_model.pdb\"\n    if not Path(pdb_file).exists():\n        continue\n    coords = extract_c1_coordinates(pdb_file)\n    res_name = np.array([x[0] for x in coords])\n    res_num = np.array(range(len(res_name))) + 1\n    coords = np.array([x[1] for x in coords])\n\n    res = pd.DataFrame({\n        \"ID\" : [target_id + \"_\" + x for x in res_num.astype(\"str\")],\n        \"resname\": res_name,\n        \"resid\": res_num,\n        \"x_1\": coords[:, 0],\n        \"y_1\": coords[:, 1],\n        \"z_1\": coords[:, 2],\n        \"x_2\": coords[:, 0],\n        \"y_2\": coords[:, 1],\n        \"z_2\": coords[:, 2],\n        \"x_3\": coords[:, 0],\n        \"y_3\": coords[:, 1],\n        \"z_3\": coords[:, 2],\n        \"x_4\": coords[:, 0],\n        \"y_4\": coords[:, 1],\n        \"z_4\": coords[:, 2],\n        \"x_5\": coords[:, 0],\n        \"y_5\": coords[:, 1],\n        \"z_5\": coords[:, 2],\n    })\n\n    subm.append(res)\n\nsubmit_rhofold = pd.concat(subm, axis = 0)\nsubmit_rhofold","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-04T15:09:17.10729Z","iopub.execute_input":"2025-03-04T15:09:17.107641Z","iopub.status.idle":"2025-03-04T15:09:17.688297Z","shell.execute_reply.started":"2025-03-04T15:09:17.107613Z","shell.execute_reply":"2025-03-04T15:09:17.687369Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"merged_df = submission_ribonanza_net.merge(\n    submit_rhofold, \n    on=['ID', 'resname', 'resid'], \n    how='left', \n    suffixes=('', '_new')\n)\nmerged_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:26:22.296965Z","iopub.execute_input":"2025-03-02T15:26:22.297292Z","iopub.status.idle":"2025-03-02T15:26:22.333989Z","shell.execute_reply.started":"2025-03-02T15:26:22.297264Z","shell.execute_reply":"2025-03-02T15:26:22.333233Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for col in submission_ribonanza_net.columns:\n    if col + '_new' in merged_df.columns:\n        if not col in [\"x_5\", \"y_5\", \"z_5\"]:\n            submission_ribonanza_net[col] = merged_df[col + '_new'].fillna(submission_ribonanza_net[col])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:31:04.753359Z","iopub.execute_input":"2025-03-02T15:31:04.753705Z","iopub.status.idle":"2025-03-02T15:31:04.766491Z","shell.execute_reply.started":"2025-03-02T15:31:04.753676Z","shell.execute_reply":"2025-03-02T15:31:04.76556Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission_ribonanza_net","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-02T15:31:08.301033Z","iopub.execute_input":"2025-03-02T15:31:08.301337Z","iopub.status.idle":"2025-03-02T15:31:08.322611Z","shell.execute_reply.started":"2025-03-02T15:31:08.301308Z","shell.execute_reply":"2025-03-02T15:31:08.321787Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission_ribonanza_net.to_csv(\"/kaggle/working/submission.csv\", index = False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-28T15:16:05.614881Z","iopub.execute_input":"2025-02-28T15:16:05.615151Z","iopub.status.idle":"2025-02-28T15:16:05.647791Z","shell.execute_reply.started":"2025-02-28T15:16:05.615131Z","shell.execute_reply":"2025-02-28T15:16:05.64717Z"}},"outputs":[],"execution_count":null}]}