{"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":39763,"databundleVersionId":11756775,"sourceType":"competition"}],"dockerImageVersionId":31012,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from collections import defaultdict\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom glob import glob\nimport os\nimport ipywidgets as widgets\nfrom IPython.display import display","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-04-10T11:10:43.377137Z","iopub.execute_input":"2025-04-10T11:10:43.377520Z","iopub.status.idle":"2025-04-10T11:10:43.382932Z","shell.execute_reply.started":"2025-04-10T11:10:43.377475Z","shell.execute_reply":"2025-04-10T11:10:43.381821Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dir = '/kaggle/input/waveform-inversion/train_samples'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-10T11:10:43.854354Z","iopub.execute_input":"2025-04-10T11:10:43.854683Z","iopub.status.idle":"2025-04-10T11:10:43.859834Z","shell.execute_reply.started":"2025-04-10T11:10:43.854660Z","shell.execute_reply":"2025-04-10T11:10:43.858831Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dict = defaultdict(lambda: defaultdict(list))\n\nfor root, dirs, files in os.walk(data_dir):\n    for file in files:\n        if file.endswith('.npy'):\n            category = os.path.basename(root)  # last part of the path (e.g., model, data)\n            scenario = os.path.basename(os.path.dirname(root)) if category in ['model', 'data'] else os.path.basename(root)\n            file_type = None\n\n            if 'seis' in file:\n                file_type = 'seismic'\n            elif 'vel' in file:\n                file_type = 'velocity'\n            elif 'model' in file:\n                file_type = 'model'\n            elif 'data' in file:\n                file_type = 'data'\n\n            if file_type:\n                full_path = os.path.join(root, file)\n                data_dict[scenario][file_type].append(full_path)\n\n# Example: print file paths in FlatVel_A\nfor key, value in data_dict.items():\n    print(f\"Scenario: {key}\")\n    for ftype, flist in value.items():\n        print(f\"  {ftype}:\")\n        for f in flist:\n            print(f\"    {f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-10T11:10:44.410753Z","iopub.execute_input":"2025-04-10T11:10:44.411118Z","iopub.status.idle":"2025-04-10T11:10:44.445172Z","shell.execute_reply.started":"2025-04-10T11:10:44.411093Z","shell.execute_reply":"2025-04-10T11:10:44.444193Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Example: Load one seismic and one model from data_dict\nseis_sample = np.load(data_dict['FlatFault_A']['seismic'][0])\nvel_sample = np.load(data_dict['FlatFault_A']['velocity'][0])\nmodel_sample = np.load(data_dict['FlatVel_A']['model'][0])\ndata_sample = np.load(data_dict['FlatVel_A']['data'][0])\n\nprint(\"Seismic shape:\", seis_sample.shape)\nprint(\"Velocity shape:\", vel_sample.shape)\nprint(\"Model shape:\", model_sample.shape)\nprint(\"Data shape:\", data_sample.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-10T11:10:44.868905Z","iopub.execute_input":"2025-04-10T11:10:44.869268Z","iopub.status.idle":"2025-04-10T11:10:45.683465Z","shell.execute_reply.started":"2025-04-10T11:10:44.869245Z","shell.execute_reply":"2025-04-10T11:10:45.682586Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_index = 50\nnum_sources = 5\nseis_sample = seis_sample[sample_index]  # shape: (num_sources, time_steps, num_receivers)\n\nplt.figure(figsize=(12, 4))\nfor i in range(num_sources):\n    plt.subplot(1, 5, i + 1)\n    plt.imshow(seis_sample[i], aspect='auto', cmap='seismic')\n    plt.title(f'Source {i}')\n    plt.gca().xaxis.set_label_position('top') \n    plt.gca().xaxis.tick_top()  # move ticks to top\n    if i == 0:\n        plt.ylabel('Time Step')\n    else:\n        plt.yticks([])\nplt.suptitle(f'Seismic Waveforms for Sample {sample_index}', fontsize=16)\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-10T11:10:50.061321Z","iopub.execute_input":"2025-04-10T11:10:50.062296Z","iopub.status.idle":"2025-04-10T11:10:51.008104Z","shell.execute_reply.started":"2025-04-10T11:10:50.062263Z","shell.execute_reply":"2025-04-10T11:10:51.007188Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def plot_all(scenario, sample_index):\n    seis_array = np.load(data_dict[scenario]['seismic'][0])\n    vel_array = np.load(data_dict[scenario]['velocity'][0])\n    \n    # Related velocity and model might be stored in *_Vel scenario (example: FlatFault_A -> FlatVel_A)\n    base_name = scenario.replace(\"Fault\", \"Vel\") if \"Fault\" in scenario else scenario.replace(\"Curve\", \"Vel\")\n    model_array = np.load(data_dict[base_name]['model'][0])\n    data_array = np.load(data_dict[base_name]['data'][0])\n    \n    seis_sample = seis_array[sample_index]     # (5, 1000, 70)\n    vel_sample = vel_array[sample_index, 0]    # (70, 70)\n    model_sample = model_array[sample_index, 0]  # (70, 70)\n    data_sample = data_array[sample_index]     # (5, 1000, 70)\n\n    num_sources = seis_sample.shape[0]\n    \n    fig, axes = plt.subplots(3, num_sources + 1, figsize=(15, 10))\n\n    for i in range(num_sources):\n        # Seismic plot\n        ax = axes[0, i]\n        ax.imshow(seis_sample[i], aspect='auto', cmap='seismic')\n        ax.set_title(f'Seismic {i+1}')\n        ax.xaxis.set_label_position('top')\n        ax.xaxis.tick_top()\n        ax.set_xlabel('Receiver')\n        ax.set_ylabel('Time' if i == 0 else \"\")\n        if i != 0:\n            ax.set_yticks([])\n\n        # Data plot\n        ax = axes[1, i]\n        ax.imshow(data_sample[i], aspect='auto', cmap='seismic')\n        ax.set_title(f'Data {i+1}')\n        ax.xaxis.set_label_position('top')\n        ax.xaxis.tick_top()\n        ax.set_xlabel('Receiver')\n        ax.set_ylabel('Time' if i == 0 else \"\")\n        if i != 0:\n            ax.set_yticks([])\n\n    # Add Velocity and Model to last column\n    ax = axes[0, -1]\n    im1 = ax.imshow(vel_sample, aspect='auto', cmap='viridis')\n    ax.set_title('Velocity')\n    ax.xaxis.set_label_position('top')\n    ax.xaxis.tick_top()\n    ax.set_xlabel('X')\n    ax.set_ylabel('Z')\n    fig.colorbar(im1, ax=ax, fraction=0.046, pad=0.04)\n\n    ax = axes[1, -1]\n    im2 = ax.imshow(model_sample, aspect='auto', cmap='viridis')\n    ax.set_title('Model')\n    ax.xaxis.set_label_position('top')\n    ax.xaxis.tick_top()\n    ax.set_xlabel('X')\n    ax.set_ylabel('Z')\n    fig.colorbar(im2, ax=ax, fraction=0.046, pad=0.04)\n\n    # Hide third row if not used\n    for ax in axes[2]:\n        ax.axis('off')\n\n    fig.suptitle(f'Visualization for {scenario} - Sample {sample_index}', fontsize=16)\n    plt.tight_layout()\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-10T11:10:56.179914Z","iopub.execute_input":"2025-04-10T11:10:56.180231Z","iopub.status.idle":"2025-04-10T11:10:56.195367Z","shell.execute_reply.started":"2025-04-10T11:10:56.180208Z","shell.execute_reply":"2025-04-10T11:10:56.194230Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"scenarios = [s for s in data_dict.keys() if 'seismic' in data_dict[s]]\nsample_index = 25 # 1 to 500\nplot_all(scenarios[0], sample_index)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-10T11:16:51.583273Z","iopub.execute_input":"2025-04-10T11:16:51.584259Z","iopub.status.idle":"2025-04-10T11:16:54.597189Z","shell.execute_reply.started":"2025-04-10T11:16:51.584230Z","shell.execute_reply":"2025-04-10T11:16:54.596278Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}