{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84969,"databundleVersionId":10033515,"sourceType":"competition"},{"sourceId":9902245,"sourceType":"datasetVersion","datasetId":6083037},{"sourceId":10104241,"sourceType":"datasetVersion","datasetId":6232544},{"sourceId":10123719,"sourceType":"datasetVersion","datasetId":6247131},{"sourceId":10123770,"sourceType":"datasetVersion","datasetId":6247176},{"sourceId":10124414,"sourceType":"datasetVersion","datasetId":6247596},{"sourceId":10124445,"sourceType":"datasetVersion","datasetId":6247613}],"dockerImageVersionId":30804,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install git+https://github.com/copick/copick-utils.git matplotlib tqdm copick","metadata":{"_uuid":"48c5a49c-a5e8-472e-910a-a64380febd10","_cell_guid":"fc31edfb-bf47-4336-809b-cfb4aa5e7f82","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:07:06.299427Z","iopub.execute_input":"2025-02-09T13:07:06.299760Z","iopub.status.idle":"2025-02-09T13:07:59.660397Z","shell.execute_reply.started":"2025-02-09T13:07:06.299720Z","shell.execute_reply":"2025-02-09T13:07:59.658992Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import copick\nimport fileinput\nimport json\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport os\nimport shutil\nimport zarr\n\nfrom glob import glob\nfrom tqdm import tqdm","metadata":{"_uuid":"e7b6ee58-1cf2-4488-a158-d759472e260d","_cell_guid":"4cb1f369-c919-418a-8440-65efbd8e2117","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:07:59.662310Z","iopub.execute_input":"2025-02-09T13:07:59.662780Z","iopub.status.idle":"2025-02-09T13:08:01.951071Z","shell.execute_reply.started":"2025-02-09T13:07:59.662729Z","shell.execute_reply":"2025-02-09T13:08:01.949909Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def ndjson_to_pick(run, particle, src_path, dest_path):\n    pick = {}\n    pick['pickable_object_name'] = particle\n    pick['user_id'] = 'curation'\n    pick['session_id'] = '0'\n    pick['run_name'] = run\n    pick['voxel_spacing'] = None\n    pick['unit'] = 'angstrom'\n    pick['points'] = []\n\n    lines = fileinput.input(files=[src_path])\n    for line in lines:\n        nd_point = json.loads(line)\n        point = {}\n        point['location'] = {}\n        point['location']['x'] = 10.012*nd_point['location']['x']\n        point['location']['y'] = 10.012*nd_point['location']['y']\n        point['location']['z'] = 10.012*nd_point['location']['z']\n        point['transformation_'] = [\n            [1.0, 0.0, 0.0, 0.0],\n            [0.0, 1.0, 0.0, 0.0],\n            [0.0, 0.0, 1.0, 0.0],\n            [0.0, 0.0, 0.0, 1.0],\n        ]\n        point['instance_id'] = 0\n        pick['points'].append(point)\n        \n    lines.close()\n    \n    with open(dest_path, 'w') as f:\n        f.write(json.dumps(pick))\n\nfrom scipy.ndimage import gaussian_filter, median_filter\n\ndef denoise_tomogram(tomogram, method='gaussian', **kwargs):\n    \"\"\"\n    Apply denoising to a tomogram.\n\n    Parameters:\n        tomogram (np.ndarray): The input tomogram to denoise.\n        method (str): The denoising method ('gaussian' or 'median').\n        kwargs: Parameters for the respective method.\n    \n    Returns:\n        np.ndarray: The denoised tomogram.\n    \"\"\"\n    if method == 'gaussian':\n        return gaussian_filter(tomogram, sigma=kwargs.get('sigma', 1))\n    elif method == 'median':\n        return median_filter(tomogram, size=kwargs.get('size', 3))\n    else:\n        raise ValueError(f\"Unsupported denoising method: {method}\")","metadata":{"_uuid":"f8a06a7a-5b32-4ec5-b7d5-8c25f020ef9c","_cell_guid":"c6946514-b3e1-41f1-a5e1-a45ff2945b88","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:08:01.954274Z","iopub.execute_input":"2025-02-09T13:08:01.955288Z","iopub.status.idle":"2025-02-09T13:08:01.966990Z","shell.execute_reply.started":"2025-02-09T13:08:01.955231Z","shell.execute_reply":"2025-02-09T13:08:01.965477Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"config_blob = \"\"\"{\n    \"name\": \"czii_cryoet_mlchallenge_2024\",\n    \"description\": \"2024 CZII CryoET ML Challenge training data.\",\n    \"version\": \"1.0.0\",\n\n    \"pickable_objects\": [\n        {\n            \"name\": \"apo-ferritin\",\n            \"is_particle\": true,\n            \"pdb_id\": \"4V1W\",\n            \"label\": 1,\n            \"color\": [  0, 117, 220, 128],\n            \"radius\": 60,\n            \"map_threshold\": 0.0418\n        },\n        {\n            \"name\": \"beta-amylase\",\n            \"is_particle\": true,\n            \"pdb_id\": \"1FA2\",\n            \"label\": 2,\n            \"color\": [153,  63,   0, 128],\n            \"radius\": 65,\n            \"map_threshold\": 0.035\n        },\n        {\n            \"name\": \"beta-galactosidase\",\n            \"is_particle\": true,\n            \"pdb_id\": \"6X1Q\",\n            \"label\": 3,\n            \"color\": [ 76,   0,  92, 128],\n            \"radius\": 90,\n            \"map_threshold\": 0.0578\n        },\n        {\n            \"name\": \"ribosome\",\n            \"is_particle\": true,\n            \"pdb_id\": \"6EK0\",\n            \"label\": 4,\n            \"color\": [  0,  92,  49, 128],\n            \"radius\": 150,\n            \"map_threshold\": 0.0374\n        },\n        {\n            \"name\": \"thyroglobulin\",\n            \"is_particle\": true,\n            \"pdb_id\": \"6SCJ\",\n            \"label\": 5,\n            \"color\": [ 43, 206,  72, 128],\n            \"radius\": 130,\n            \"map_threshold\": 0.0278\n        },\n        {\n            \"name\": \"virus-like-particle\",\n            \"is_particle\": true,\n            \"pdb_id\": \"6N4V\",            \n            \"label\": 6,\n            \"color\": [255, 204, 153, 128],\n            \"radius\": 135,\n            \"map_threshold\": 0.201\n        }\n    ],\n\n    \"overlay_root\": \"/kaggle/working/overlay\",\n\n    \"overlay_fs_args\": {\n        \"auto_mkdir\": true\n    }\n\n}\"\"\"\n# \"static_root\": \"/kaggle/input/czii-cryo-et-object-identification/train/static\"\n\ncopick_config_path = \"/kaggle/working/copick.config\"\noutput_overlay = \"/kaggle/working/overlay\"\n\nwith open(copick_config_path, \"w\") as f:\n    f.write(config_blob)","metadata":{"_uuid":"dc78372f-7fe6-43ba-931f-b76eddfa43c3","_cell_guid":"ea320508-e4ea-4d9e-9621-ec0fe2c62726","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:08:01.968337Z","iopub.execute_input":"2025-02-09T13:08:01.968657Z","iopub.status.idle":"2025-02-09T13:08:01.985333Z","shell.execute_reply.started":"2025-02-09T13:08:01.968627Z","shell.execute_reply":"2025-02-09T13:08:01.984236Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pick_map = {\n    'ferritin_complex': 'apo-ferritin',\n    'beta_amylase': 'beta-amylase',\n    'beta_galactosidase': 'beta-galactosidase',\n    'cytosolic_ribosome': 'ribosome',\n    'thyroglobulin': 'thyroglobulin',\n    'pp7_vlp': 'virus-like-particle',\n}\n\n#/kaggle/input/czii10441/10441/**/*.ndjson\n#ndjson_files = glob('/kaggle/input/czii-cryoet-simulated-training-data-ts*/**/*.ndjson',\n\nndjson_files = glob('/kaggle/input/czii10441/10441/**/*.ndjson',\n                    recursive=True)\n\nprint(f\"found {len(ndjson_files)} files\")\n\nfor file in ndjson_files:\n    print(file)\n    run = file.split('/')[5]\n    print(run)\n    if \"_\" not in run:\n        continue\n    particle = pick_map[file.split('/')[10].split('-')[0]]\n    dest_dir = f'/kaggle/working/overlay/ExperimentRuns/{run}/Picks'\n    dest_path = f'{dest_dir}/curation_0_{particle}.json'\n    os.makedirs(dest_dir, exist_ok=True)\n    ndjson_to_pick(run, particle, file, dest_path)","metadata":{"_uuid":"8f3e0747-df56-43be-a19b-53f9ba3ae5a9","_cell_guid":"09f24bc9-3ce1-48e9-ac69-7e0987824bcf","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:08:01.986695Z","iopub.execute_input":"2025-02-09T13:08:01.987001Z","iopub.status.idle":"2025-02-09T13:08:44.491836Z","shell.execute_reply.started":"2025-02-09T13:08:01.986972Z","shell.execute_reply":"2025-02-09T13:08:44.490652Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"root = copick.from_file(copick_config_path)\n\ncopick_user_name = \"copickUtils\"\ncopick_segmentation_name = \"paintedPicks\"\nvoxel_size = 10\ntomo_type = \"denoised\"","metadata":{"_uuid":"ce02111b-892a-4a38-942d-59bfbf23b455","_cell_guid":"b1f540ec-19db-469a-aa46-f80ea811d1df","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:08:44.493103Z","iopub.execute_input":"2025-02-09T13:08:44.493485Z","iopub.status.idle":"2025-02-09T13:08:44.500816Z","shell.execute_reply.started":"2025-02-09T13:08:44.493450Z","shell.execute_reply":"2025-02-09T13:08:44.499729Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from copick_utils.segmentation import segmentation_from_picks\nimport copick_utils.writers.write as write\nfrom collections import defaultdict\n\n# Just do this once\ngenerate_masks = True\n\nif generate_masks:\n    target_objects = defaultdict(dict)\n    for object in root.pickable_objects:\n        if object.is_particle:\n            target_objects[object.name]['label'] = object.label\n            target_objects[object.name]['radius'] = object.radius\n\n\n    for run in tqdm(root.runs):\n        # tomo = run.get_voxel_spacing(10)\n        # tomo = tomo.get_tomogram(tomo_type).numpy()\n        # target = np.zeros(tomo.shape, dtype=np.uint8)\n        target = np.zeros((200, 630, 630), dtype=np.uint8)\n        for pickable_object in root.pickable_objects:\n            pick = run.get_picks(object_name=pickable_object.name, user_id=\"curation\")\n            if len(pick):  \n                target = segmentation_from_picks.from_picks(pick[0], \n                                                            target, \n                                                            target_objects[pickable_object.name]['radius'] * 0.8,\n                                                            target_objects[pickable_object.name]['label']\n                                                            )\n        write.segmentation(run, target, copick_user_name, name=copick_segmentation_name)","metadata":{"_uuid":"550e87d9-d3b4-4c99-9216-6b9e85d765ec","_cell_guid":"1af86e66-d4b1-4290-bd7b-5fef40ec7c3e","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:08:44.502533Z","iopub.execute_input":"2025-02-09T13:08:44.502902Z","iopub.status.idle":"2025-02-09T13:08:54.892573Z","shell.execute_reply.started":"2025-02-09T13:08:44.502868Z","shell.execute_reply":"2025-02-09T13:08:54.891535Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#tomograms = glob('/kaggle/input/czii-cryoet-simulated-training-data-ts*/**/Tomograms/**/*.zarr',\n\n#/kaggle/input/czii10441/10441/**/*.ndjson\n\ntomograms = glob('/kaggle/input/czii10441/10441/**/Tomograms/**/*.zarr',\n                 recursive=True)\ntomogram_map = {}\nfor t in tomograms:\n    print(t.split('/')[5])\n    tomogram_map[t.split('/')[5]] = t","metadata":{"_uuid":"99f38c3d-2ca7-4779-a51d-7cb6e5cfe093","_cell_guid":"800858b8-8d9a-48eb-837a-f785da13c912","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:08:54.893981Z","iopub.execute_input":"2025-02-09T13:08:54.894382Z","iopub.status.idle":"2025-02-09T13:09:03.004126Z","shell.execute_reply.started":"2025-02-09T13:08:54.894349Z","shell.execute_reply":"2025-02-09T13:09:03.003203Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(tomogram_map)","metadata":{"_uuid":"e37b4b98-5a16-4e44-8668-f514b246ea7d","_cell_guid":"bd115da2-0f1c-4cc0-8619-7299dfe1f010","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:09:03.008750Z","iopub.execute_input":"2025-02-09T13:09:03.009121Z","iopub.status.idle":"2025-02-09T13:09:03.014632Z","shell.execute_reply.started":"2025-02-09T13:09:03.009089Z","shell.execute_reply":"2025-02-09T13:09:03.013408Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_tomograms = len(root.runs)\nfirst_third = int(num_tomograms) / 3\nsecond_third = 2 * int(num_tomograms) / 3\nchunk_boundaries = [\n    (0, first_third),\n    (first_third, second_third),\n    (second_third, num_tomograms),\n]\n\nchunk_index = 0\nstart_idx, end_idx = chunk_boundaries[chunk_index]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-09T13:09:03.016150Z","iopub.execute_input":"2025-02-09T13:09:03.016599Z","iopub.status.idle":"2025-02-09T13:09:03.030308Z","shell.execute_reply.started":"2025-02-09T13:09:03.016553Z","shell.execute_reply":"2025-02-09T13:09:03.029023Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dicts = []\nprint(root.runs)\ncount = 0\nfor i, run in tqdm(enumerate(root.runs), total=num_tomograms):\n    if not (start_idx <= i < end_idx):\n        continue\n    # if count == 7:\n    #     break\n    print(run.name)\n    if run.name not in tomogram_map:\n        print(f\"Run '{run.name}' does not have a corresponding tomogram. Skipping.\")\n        continue\n    tomogram_path = tomogram_map[run.name]\n    tomogram = np.array(zarr.open(tomogram_path, mode='r')[0])[:184]\n    tomogram_denoised = denoise_tomogram(tomogram, method='gaussian', sigma=1)  # Apply denoising\n\n    segmentation = run.get_segmentations(name=copick_segmentation_name, user_id=copick_user_name, voxel_size=voxel_size, is_multilabel=True)[0].numpy()[:184]\n    data_dicts.append({\n        \"name\": run.name, \n        \"original_image\": tomogram,          # Storing original image\n        \"denoised_image\": tomogram_denoised, # Storing denoised image\n        \"label\": segmentation\n    })\n    count +=1\n    \nprint(np.unique(data_dicts[0]['label']))","metadata":{"_uuid":"60485be0-0292-4cae-bfc1-990d7a03744e","_cell_guid":"fa5d825d-1897-4d99-a492-a4967adef86b","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:09:03.031774Z","iopub.execute_input":"2025-02-09T13:09:03.032114Z","iopub.status.idle":"2025-02-09T13:10:04.168861Z","shell.execute_reply.started":"2025-02-09T13:09:03.032083Z","shell.execute_reply":"2025-02-09T13:10:04.167706Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dicts[0]['label'].shape","metadata":{"_uuid":"1e18580f-5138-4321-b824-65d6205c3516","_cell_guid":"675ad6d7-b9e3-49a7-a781-613eee0fee60","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:10:04.170377Z","iopub.execute_input":"2025-02-09T13:10:04.170824Z","iopub.status.idle":"2025-02-09T13:10:04.180010Z","shell.execute_reply.started":"2025-02-09T13:10:04.170778Z","shell.execute_reply":"2025-02-09T13:10:04.178891Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"data_dicts[0]['original_image'].shape","metadata":{"_uuid":"d30f6c04-6f2d-413a-a4fb-a4e4c38ac618","_cell_guid":"eaea4f09-3e17-4cf9-896f-365b54f621ba","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:10:04.181427Z","iopub.execute_input":"2025-02-09T13:10:04.181757Z","iopub.status.idle":"2025-02-09T13:10:04.194901Z","shell.execute_reply.started":"2025-02-09T13:10:04.181726Z","shell.execute_reply":"2025-02-09T13:10:04.193862Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in range(len(data_dicts)):\n    with open(f\"train_original_image_{data_dicts[i]['name']}.npy\", 'wb') as f:\n        np.save(f, data_dicts[i]['original_image'])\n        \n    with open(f\"train_image_{data_dicts[i]['name']}.npy\", 'wb') as f:\n        np.save(f, data_dicts[i]['denoised_image'])\n        \n    with open(f\"train_label_{data_dicts[i]['name']}.npy\", 'wb') as f:\n        np.save(f, data_dicts[i]['label'])","metadata":{"_uuid":"08fc7ff2-1701-4577-823f-82364fb11395","_cell_guid":"ebaca749-bddc-4b78-8c40-4252b3156e8d","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:10:04.195876Z","iopub.execute_input":"2025-02-09T13:10:04.196187Z","iopub.status.idle":"2025-02-09T13:10:12.664469Z","shell.execute_reply.started":"2025-02-09T13:10:04.196140Z","shell.execute_reply":"2025-02-09T13:10:12.663075Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!ls -lh","metadata":{"_uuid":"e9b703ab-c2a1-4181-8776-567aba315025","_cell_guid":"2de241a7-bf37-4ae8-b725-1858b28e73b0","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:10:12.666203Z","iopub.execute_input":"2025-02-09T13:10:12.666679Z","iopub.status.idle":"2025-02-09T13:10:14.135306Z","shell.execute_reply.started":"2025-02-09T13:10:12.666631Z","shell.execute_reply":"2025-02-09T13:10:14.133297Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Image vs. Label","metadata":{"_uuid":"2fae8dc2-a6b8-4061-958c-a59e8840e3c5","_cell_guid":"e1f890f3-4138-42e6-a7c0-cac2aa18d26c","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false}}},{"cell_type":"code","source":"plt.figure(figsize=(15,5))\n\n# Plot Original Image\nplt.subplot(1,3,1)\nplt.title(\"Original Image\")\nplt.xticks([])\nplt.yticks([])\nplt.imshow(data_dicts[0]['original_image'][92], cmap='gray', vmin=-2, vmax=2)\n\n# Plot Denoised Image\nplt.subplot(1,3,2)\nplt.title(\"Denoised Image\")\nplt.xticks([])\nplt.yticks([])\nplt.imshow(data_dicts[0]['denoised_image'][92], cmap='gray', vmin=-2, vmax=2)\n\n# Plot Label\nplt.subplot(1,3,3)\nplt.title(\"Label\")\nplt.xticks([])\nplt.yticks([])\n_ = plt.imshow(data_dicts[0]['label'][92])\n\nplt.tight_layout()\nplt.show()","metadata":{"_uuid":"8f61b9c7-4c7c-4851-a46f-5c1dbb133d5f","_cell_guid":"9cf53b65-e50f-42a7-9b94-6419229e509f","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-02-09T13:10:14.137397Z","iopub.execute_input":"2025-02-09T13:10:14.137973Z","iopub.status.idle":"2025-02-09T13:10:24.680724Z","shell.execute_reply.started":"2025-02-09T13:10:14.137930Z","shell.execute_reply":"2025-02-09T13:10:24.678600Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# !ls -lah","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-09T13:10:24.683735Z","iopub.execute_input":"2025-02-09T13:10:24.684364Z","iopub.status.idle":"2025-02-09T13:10:25.171312Z","shell.execute_reply.started":"2025-02-09T13:10:24.684296Z","shell.execute_reply":"2025-02-09T13:10:25.169672Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# !mkdir -p /tmp/outputs\n# !mv train* /tmp/outputs\n# !mv overlay /tmp/outputs\n# !mv copick.config /tmp/outputs\n# !ls -lah /tmp/outputs","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-09T13:10:25.173064Z","iopub.execute_input":"2025-02-09T13:10:25.173563Z","iopub.status.idle":"2025-02-09T13:10:26.160916Z","shell.execute_reply.started":"2025-02-09T13:10:25.173514Z","shell.execute_reply":"2025-02-09T13:10:26.159311Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# !zip -r data.zip /tmp/outputs","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-09T13:10:26.162314Z","iopub.execute_input":"2025-02-09T13:10:26.162765Z","iopub.status.idle":"2025-02-09T13:10:26.949222Z","shell.execute_reply.started":"2025-02-09T13:10:26.162705Z","shell.execute_reply":"2025-02-09T13:10:26.947804Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"done\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-09T13:10:26.951235Z","iopub.execute_input":"2025-02-09T13:10:26.951805Z","iopub.status.idle":"2025-02-09T13:10:27.984604Z","shell.execute_reply.started":"2025-02-09T13:10:26.951739Z","shell.execute_reply":"2025-02-09T13:10:27.983181Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!ls -lah","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-09T13:10:27.986225Z","iopub.execute_input":"2025-02-09T13:10:27.986591Z","iopub.status.idle":"2025-02-09T13:10:30.316410Z","shell.execute_reply.started":"2025-02-09T13:10:27.986560Z","shell.execute_reply":"2025-02-09T13:10:30.314811Z"}},"outputs":[],"execution_count":null}]}