{"cells":[{"cell_type":"markdown","metadata":{},"source":"# Stanford RNA 3D Folding Part 2 - A-Form Helix Baseline\n\nSimple baseline that generates A-form RNA helix coordinates with variations.\nReady for immediate submission - no additional datasets required."},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":"import pandas as pd\nimport numpy as np\nfrom scipy.spatial.transform import Rotation\n\n# A-form RNA helix parameters (Angstroms)\nA_FORM_PARAMS = {\n    'rise': 2.8,      # Rise per residue\n    'twist': 32.7,    # Twist angle (degrees)\n    'radius': 9.0     # Helix radius\n}\n\ndef generate_helix_coords(sequence, variation_idx=0):\n    \"\"\"Generate A-form helix C1' coordinates for an RNA sequence.\"\"\"\n    length = len(sequence)\n    np.random.seed(variation_idx * 42)\n    variation = 0.9 + 0.2 * np.random.random()\n    \n    params = {\n        'rise': A_FORM_PARAMS['rise'] * (0.9 + 0.2 * np.random.random()),\n        'twist': np.deg2rad(A_FORM_PARAMS['twist'] * (0.9 + 0.2 * np.random.random())),\n        'radius': A_FORM_PARAMS['radius'] * variation\n    }\n    \n    coords = []\n    for i in range(length):\n        angle = i * params['twist']\n        x = params['radius'] * np.cos(angle)\n        y = params['radius'] * np.sin(angle)\n        z = i * params['rise']\n        coords.append([x, y, z])\n    \n    coords = np.array(coords)\n    \n    # Apply random rotation for variation\n    if variation_idx > 0:\n        rotation = Rotation.from_euler('xyz', \n            [np.random.uniform(-30, 30) for _ in range(3)], \n            degrees=True).as_matrix()\n        coords = coords @ rotation\n    \n    # Center the structure\n    coords = coords - np.mean(coords, axis=0)\n    return coords\n\nprint(\"Functions defined.\")"},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":"# Load data\nsample = pd.read_csv('/kaggle/input/stanford-rna-3d-folding-2/sample_submission.csv')\ntest_df = pd.read_csv('/kaggle/input/stanford-rna-3d-folding-2/test_sequences.csv')\n\n# Build sequence lookup\nseq_lookup = dict(zip(test_df['target_id'], test_df['sequence']))\n\nprint(f\"Loaded {len(test_df)} sequences\")\nprint(f\"Total residues: {len(sample)}\")"},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":"# Generate predictions\nall_data = []\ncurrent_target = None\ncurrent_models = None\n\nfor idx, row in sample.iterrows():\n    id_parts = row['ID'].rsplit('_', 1)\n    target_id = id_parts[0]\n    resid = int(id_parts[1])\n    \n    # Generate models for new target\n    if target_id != current_target:\n        current_target = target_id\n        sequence = seq_lookup[target_id]\n        current_models = [generate_helix_coords(sequence, i) for i in range(5)]\n        print(f\"Processing {target_id} (len={len(sequence)})\")\n    \n    # Get coordinates for this residue\n    i = resid - 1\n    row_data = {\n        'ID': row['ID'],\n        'resname': row['resname'],\n        'resid': row['resid']\n    }\n    \n    for model_idx, model_coords in enumerate(current_models, 1):\n        row_data[f'x_{model_idx}'] = float(model_coords[i, 0])\n        row_data[f'y_{model_idx}'] = float(model_coords[i, 1])\n        row_data[f'z_{model_idx}'] = float(model_coords[i, 2])\n    \n    all_data.append(row_data)\n\nprint(f\"\\nProcessed {len(all_data)} residues\")"},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":"# Create submission DataFrame\nsubmission_df = pd.DataFrame(all_data)\n\n# Ensure correct column order\ncolumn_order = ['ID', 'resname', 'resid']\nfor i in range(1, 6):\n    column_order.extend([f'x_{i}', f'y_{i}', f'z_{i}'])\n\nsubmission_df = submission_df[column_order]\n\n# Save submission\nsubmission_df.to_csv('submission.csv', index=False, float_format='%.3f')\n\n# Validate\nprint(f\"Submission shape: {submission_df.shape}\")\nprint(f\"ID match: {(submission_df['ID'] == sample['ID']).all()}\")\nprint(f\"resname match: {(submission_df['resname'] == sample['resname']).all()}\")\nprint(f\"resid match: {(submission_df['resid'] == sample['resid']).all()}\")\n\nsubmission_df.head(10)"}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.10.0"}},"nbformat":4,"nbformat_minor":4}