{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","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":12276181,"sourceType":"competition"},{"sourceId":11838134,"sourceType":"datasetVersion","datasetId":7432609}],"dockerImageVersionId":31041,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport subprocess\nimport sys\nimport pandas as pd\nimport glob\nimport shutil\nimport numpy as np\nfrom Bio.PDB import PDBParser\nimport multiprocessing\nimport argparse\nfrom pathlib import Path\nimport time\n\n# Define paths - Kaggle specific\nCOMPETITION_PATH = \"/kaggle/input/stanford-rna-3d-folding\"\nWORKSPACE_PATH = \"/kaggle/working\"\nTRROSETTARNA_PATH = \"/kaggle/input/rna3d-project-trrosettarna-v1-1\"\n\n# Setup directories\nfasta_dir = os.path.join(WORKSPACE_PATH, \"fasta_files\")\noutput_dir = os.path.join(WORKSPACE_PATH, \"predictions\")\ndata_dir = os.path.join(WORKSPACE_PATH, \"data\")\nos.makedirs(fasta_dir, exist_ok=True)\nos.makedirs(output_dir, exist_ok=True)\nos.makedirs(data_dir, exist_ok=True)\n\nprint(\"Copying trRosettaRNA files to working directory...\")\nsubprocess.run(f\"cp -r {TRROSETTARNA_PATH}/* {WORKSPACE_PATH}/\", shell=True)\n\n# Create a data directory structure that mirrors the competition data\n# but is writable in the working directory\nprint(\"Setting up writable data directory structure...\")\n\n# First, copy essential files from competition data\nfor file_pattern in [\"*.csv\", \"sample_submission.csv\", \"README.md\"]:\n    subprocess.run(f\"cp -r {COMPETITION_PATH}/{file_pattern} {data_dir}/\", shell=True, stderr=subprocess.PIPE)\n\n# Copy MSA directories if they exist\nfor msa_dir in [\"MSA\", \"MSA_v2\"]:\n    competition_msa_path = os.path.join(COMPETITION_PATH, msa_dir)\n    if os.path.exists(competition_msa_path):\n        # Create the directory in our working data path\n        working_msa_path = os.path.join(data_dir, msa_dir)\n        os.makedirs(working_msa_path, exist_ok=True)\n\n        # Copy MSA files (this might take time for large datasets)\n        print(f\"Copying {msa_dir} files (this may take a while)...\")\n        subprocess.run(f\"cp -r {competition_msa_path}/* {working_msa_path}/\", shell=True, stderr=subprocess.PIPE)\n\n# Create secondary_structures directory in our writable data path\nss_dir = os.path.join(data_dir, \"secondary_structures\")\nos.makedirs(ss_dir, exist_ok=True)\n\nprint(\"Data directory setup complete. Checking structure:\")\nsubprocess.run(f\"ls -la {data_dir}\", shell=True)\n\n# Add the current directory to Python path so imports work correctly\nsys.path.insert(0, WORKSPACE_PATH)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-05-17T00:28:29.091609Z","iopub.execute_input":"2025-05-17T00:28:29.092891Z","iopub.status.idle":"2025-05-17T00:29:26.938468Z","shell.execute_reply.started":"2025-05-17T00:28:29.092845Z","shell.execute_reply":"2025-05-17T00:29:26.937395Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!ls /kaggle/working","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-17T00:29:26.940256Z","iopub.execute_input":"2025-05-17T00:29:26.940764Z","iopub.status.idle":"2025-05-17T00:29:27.065692Z","shell.execute_reply.started":"2025-05-17T00:29:26.94074Z","shell.execute_reply":"2025-05-17T00:29:27.06462Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Fix the paths in run_model.py to use the Kaggle directories\nprint(\"Updating path variables to match Kaggle environment...\")\nwith open(\"run_model.py\", \"r\") as f:\n    content = f.read()\n\n# Replace the data directory path\ncontent = content.replace(\n    \"data_dir = os.path.join(project_dir, \\\"data/stanford-rna-3d-folding\\\")\",\n    f\"data_dir = \\\"{data_dir}\\\"\"\n)\n\n# Replace the trRosettaRNA directory path\ncontent = content.replace(\n    \"trrosettarna_dir = \\\"/Users/anemos/Desktop/有事/Harvard/4Spring_2025/BST_236/rna3d-project_trRosettaRNA_v1.1\\\"\",\n    f\"trrosettarna_dir = \\\"{WORKSPACE_PATH}\\\"\"\n)\n\n# Save the modified run_model.py\nwith open(\"run_model.py\", \"w\") as f:\n    f.write(content)\n\nprint(\"Path variables updated in run_model.py\")\n\n# Run the model\nprint(\"\\n=== Running trRosettaRNA Model ===\\n\")\n\n# Determine appropriate arguments based on Kaggle's resources\n# Kaggle typically provides 4 CPUs and 1 GPU\nnum_cpus = os.cpu_count() or 4  # Use all available CPUs\ngpu_flag = \"0\"  # Use the GPU if available\n\n# We'll use a multi-stage approach:\n# 1. Prepare data\n# 2. Run predictions with parallelization\n# 3. Create submission\n\n# Stage 1: Prepare data\nprint(\"\\n=== Stage 1: Preparing Data ===\\n\")\nsubprocess.run(f\"python run_model.py --prepare_only --processes {num_cpus} --gpu {gpu_flag}\", \n               shell=True, check=True)\n\n# Stage 2: Run predictions with parallelization\nprint(\"\\n=== Stage 2: Running Predictions ===\\n\")\nsubprocess.run(f\"python run_model.py --parallel --processes {num_cpus} --gpu {gpu_flag}\", \n               shell=True, check=True)\n\n# Stage 3: Create submission\nprint(\"\\n=== Stage 3: Creating Submission ===\\n\")\nsubprocess.run(\"python run_model.py --submit_only\", shell=True, check=True)\n\n# Verify the submission file exists\nsubmission_file = os.path.join(WORKSPACE_PATH, \"submission.csv\")\nif os.path.exists(submission_file):\n    print(f\"\\nSubmission file created: {submission_file}\")\n    \n    # Read and display a sample of the submission\n    submission_df = pd.read_csv(submission_file)\n    print(f\"\\nSubmission contains {len(submission_df)} rows and {len(submission_df.columns)} columns\")\n    print(\"\\nSample of submission file:\")\n    print(submission_df.head())\n    \n    # Check for any zero values (potential issues)\n    zero_count = 0\n    nonzero_count = 0\n    for col in [f'{c}_{i}' for c in ['x', 'y', 'z'] for i in range(1, 6)]:\n        if col in submission_df.columns:\n            zeros = (submission_df[col] == 0).sum()\n            nonzeros = (submission_df[col] != 0).sum()\n            zero_count += zeros\n            nonzero_count += nonzeros\n    \n    print(f\"\\nCoordinate statistics: {nonzero_count} non-zero values, {zero_count} zero values\")\n    print(f\"Zero value percentage: {zero_count/(zero_count+nonzero_count)*100:.2f}%\")\n    \n    if nonzero_count == 0:\n        print(\"WARNING: No non-zero coordinates in submission - check for errors!\")\n    elif zero_count > 0.9 * (zero_count + nonzero_count):\n        print(\"WARNING: More than 90% of coordinates are zero - check for errors!\")\n    else:\n        print(\"Submission looks valid!\")\nelse:\n    print(\"ERROR: Submission file not created!\")\n\nprint(\"\\nDone! Submission file is ready for the competition.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-17T00:29:27.06695Z","iopub.execute_input":"2025-05-17T00:29:27.067325Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# !head /kaggle/working/predictions/8BD5_B/predict.log","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}