{"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":"none","dataSources":[{"sourceId":87793,"databundleVersionId":11403143,"sourceType":"competition"},{"sourceId":10855324,"sourceType":"datasetVersion","datasetId":6742586},{"sourceId":10880419,"sourceType":"datasetVersion","datasetId":6760509},{"sourceId":11065669,"sourceType":"datasetVersion","datasetId":6889817},{"sourceId":11111396,"sourceType":"datasetVersion","datasetId":6921394}],"dockerImageVersionId":30919,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from datetime import datetime\nimport pytz\nprint('LOGGING TIME OF START:',  datetime.strftime(datetime.now(pytz.timezone('Asia/Singapore')), \"%Y-%m-%d %H:%M:%S\"))\n\n\ntry:\n    import Bio\nexcept:\n    pass\n    #for drfold2 --------\n    #!pip install biopython\n    #!pip install /kaggle/input/biopython/biopython-1.85-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\n\nprint('PIP INSTALL OK !!!!')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-03-21T03:29:55.526893Z","iopub.execute_input":"2025-03-21T03:29:55.527246Z","iopub.status.idle":"2025-03-21T03:29:55.533758Z","shell.execute_reply.started":"2025-03-21T03:29:55.527219Z","shell.execute_reply":"2025-03-21T03:29:55.532990Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os,sys\n\nimport pandas as pd\npd.set_option('display.max_columns', 20)\npd.set_option('display.expand_frame_repr', False)\n\nimport numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom timeit import default_timer as timer\nimport re\n\nimport matplotlib \nimport matplotlib.pyplot as plt\n\n\n# helper--\nclass dotdict(dict):\n\t__setattr__ = dict.__setitem__\n\t__delattr__ = dict.__delitem__\n\n\tdef __getattr__(self, name):\n\t\ttry:\n\t\t\treturn self[name]\n\t\texcept KeyError:\n\t\t\traise AttributeError(name)\n\ndef time_to_str(t, mode='min'):\n\tif mode=='min':\n\t\tt  = int(t)/60\n\t\thr = t//60\n\t\tmin = t%60\n\t\treturn '%2d hr %02d min'%(hr,min) \n\telif mode=='sec':\n\t\tt   = int(t)\n\t\tmin = t//60\n\t\tsec = t%60\n\t\treturn '%2d min %02d sec'%(min,sec)\n\n\telse:\n\t\traise NotImplementedError\n\ndef gpu_memory_use():\n    if torch.cuda.is_available():\n        device = torch.device(0)\n        free, total = torch.cuda.mem_get_info(device)\n        used= (total - free) / 1024 ** 3\n        return int(round(used))\n    else:\n        return 0\n\ndef set_aspect_equal(ax):\n\tx_limits = ax.get_xlim()\n\ty_limits = ax.get_ylim()\n\tz_limits = ax.get_zlim()\n\n\t# Compute the mean of each axis\n\tx_middle = np.mean(x_limits)\n\ty_middle = np.mean(y_limits)\n\tz_middle = np.mean(z_limits)\n\n\t# Compute the max range across all axes\n\tmax_range = max(x_limits[1] - x_limits[0],\n\t\t\t\t\ty_limits[1] - y_limits[0],\n\t\t\t\t\tz_limits[1] - z_limits[0]) / 2.0\n\n\t# Set the new limits to ensure equal scaling\n\tax.set_xlim(x_middle - max_range, x_middle + max_range)\n\tax.set_ylim(y_middle - max_range, y_middle + max_range)\n\tax.set_zlim(z_middle - max_range, z_middle + max_range)\n\n\nprint('torch',torch.__version__)\nprint('torch.cuda',torch.version.cuda)\n\nprint('IMPORT OK!!!')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T03:29:55.552354Z","iopub.execute_input":"2025-03-21T03:29:55.552684Z","iopub.status.idle":"2025-03-21T03:29:55.565079Z","shell.execute_reply.started":"2025-03-21T03:29:55.552652Z","shell.execute_reply":"2025-03-21T03:29:55.563870Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"MODE = 'submit' #'local' # submit\n\nDATA_KAGGLE_DIR = '/kaggle/input/stanford-rna-3d-folding'\nif MODE == 'local':\n    valid_df = pd.read_csv(f'{DATA_KAGGLE_DIR}/validation_sequences.csv')\n    label_df = pd.read_csv(f'{DATA_KAGGLE_DIR}/validation_labels.csv')\n    label_df['target_id'] = label_df['ID'].apply(lambda x: '_'.join(x.split('_')[:-1]))\n\n    valid_df = valid_df.iloc[[0,1,2]]\n\nif MODE == 'submit':\n\tvalid_df = pd.read_csv(f'{DATA_KAGGLE_DIR}/test_sequences.csv')\n\t#valid_df = pd.read_csv(f'/kaggle/input/hengck23-top-data/casp16_top1_sequence_df.csv')\n\nprint('len(valid_df)',len(valid_df))\nprint(valid_df.iloc[0])\nprint('')\n\n\n# cfg = dotdict(\n#     num_conf = 5,\n#     max_length=480,\n# )\n\nNUM_CONF=5\nMAX_LENGTH=480\nDEVICE='cuda' #'cpu'\n\nprint('MODE:', MODE)\nprint('SETTING OK!!!')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T03:29:55.566164Z","iopub.execute_input":"2025-03-21T03:29:55.566494Z","iopub.status.idle":"2025-03-21T03:29:55.590853Z","shell.execute_reply.started":"2025-03-21T03:29:55.566452Z","shell.execute_reply":"2025-03-21T03:29:55.589986Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"###########################################################3\n \n# data helper\ndef make_data(seq):\n    aa_type = parse_seq(seq)\n    base = Get_base(seq, BASE_COOR)\n    seq_idx = np.arange(len(seq)) + 1\n\n    msa = aa_type[None, :]\n    msa = torch.from_numpy(msa)\n    msa = torch.cat([msa, msa], 0) #???\n    msa = F.one_hot(msa.long(), 6).float()\n\n    base_x  = torch.from_numpy(base).float()\n    seq_idx = torch.from_numpy(seq_idx).long()\n    return msa, base_x, seq_idx\n    \ndef make_dummy_solution():\n    solution=dotdict()\n    for i, row in valid_df.iterrows():\n        target_id = row.target_id\n        sequence = row.sequence\n        solution[target_id]=dotdict(\n            target_id=target_id,\n            sequence=sequence,\n            coord=[\n                np.zeros((len(sequence),3), dtype=np.float32) for j in range(5)\n            ],\n        )\n    return solution\n\ndef solution_to_submit_df(solution):\n    submit_df = []\n    for k,s in solution.items():\n        df = coord_to_df(s.sequence, s.coord, s.target_id)\n        submit_df.append(df)\n    \n    submit_df = pd.concat(submit_df)\n    return submit_df\n \n\ndef coord_to_df(sequence, coord, target_id):\n    L = len(sequence)\n    df = pd.DataFrame()\n    df['ID'] = [f'{target_id}_{i + 1}' for i in range(L)]\n    df['resname'] = [s for s in sequence]\n    df['resid'] = [i + 1 for i in range(L)]\n\n    num_coord = len(coord)\n    for j in range(num_coord):\n        df[f'x_{j+1}'] = coord[j][:, 0]\n        df[f'y_{j+1}'] = coord[j][:, 1]\n        df[f'z_{j+1}'] = coord[j][:, 2]\n    return df\n\n################### start here !!! #######################################################3\n#---\nimport pickle\ntop_file =\\\n'/kaggle/input/hengck23-top-data/af3-casp16_out.pkl'\n    #'/kaggle/input/hengck23-top-data/vfold-casp16_out.pkl'\n    #'/kaggle/input/hengck23-top-data/drfold2-casp16_out.pkl'\nwith open(top_file, 'rb') as f:\n\tCASP_TOP = pickle.load(f)\nprint('CASP_TOP read !!!!!')\n#----\n\nsolution = make_dummy_solution()\n#----\nfor i,row in valid_df.iterrows():\n    target_id = row.target_id\n    sequence = row.sequence\n    #sequence='AAGUACCCUCCAAGCCCUACAGGUUGGAAGAGGGGGCUAUCAGUCCUGUAGGCAGACUC'\n    #if len(sequence)<200: continue    \n    #if len(sequence)>400: continue\n    \n    top = CASP_TOP.get(sequence,None)\n    if top is None: continue\n    if len(top)==0: continue\n    \n    #print(top)\n    print('\\r', i, len(top), target_id, sequence[:10] + '...','found!', end='', flush=True)\n \n    nL = min(len(row.sequence), len(top[0]))\n    for k in range(len(top)):\n        solution[target_id].coord[k][:nL]=top[k][:nL]\n        \nprint('')\n#----\n\n\nsubmit_df = solution_to_submit_df(solution)\nsubmit_df.to_csv(f'submission.csv', index=False)\nprint(submit_df)\nprint('SUBMIT OK!!!!!!')\nprint('')\n \n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-21T03:29:55.592685Z","iopub.execute_input":"2025-03-21T03:29:55.593028Z","iopub.status.idle":"2025-03-21T03:29:55.710471Z","shell.execute_reply.started":"2025-03-21T03:29:55.593001Z","shell.execute_reply":"2025-03-21T03:29:55.709610Z"}},"outputs":[],"execution_count":null}]}