{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "d612bda6-046b-4a28-a9fa-ae5b433d1f73", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded 5198121 lines from .txt files.\n" ] } ], "source": [ "# load ensembl pool\n", "\n", "\n", "\n", "import os\n", "\n", "# Path to the directory containing .txt files\n", "directory = 'speciesrepo'\n", "\n", "# List to hold all lines from all files\n", "ensemblPoolAnnotated = []\n", "\n", "# Loop through all files in the directory\n", "for filename in os.listdir(directory):\n", " if filename.endswith('.txt'):\n", " filepath = os.path.join(directory, filename)\n", " with open(filepath, 'r', encoding='utf-8') as file:\n", " lines = file.readlines()\n", " ensemblPoolAnnotated.extend([line.strip() for line in lines]) # Strip newline characters\n", "\n", "# Now `all_lines` contains all lines from all .txt files\n", "print(f\"Loaded {len(ensemblPoolAnnotated)} lines from .txt files.\")" ] }, { "cell_type": "code", "execution_count": 2, "id": "ca1f3a1f-c5a8-4a6a-9c97-62e4b3314214", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded 103608 lines.\n" ] } ], "source": [ "cleavageProject = []\n", "# Define the path to the file\n", "file_path = 'stabilitySeqPrediction/decoded_seqs_train_ALL.txt'\n", "\n", "# Read all lines into a list\n", "with open(file_path, 'r', encoding='utf-8') as f:\n", " cleavageProject = [line.strip().strip('A') for line in f]\n", "\n", "# Now 'lines' contains all lines in the file, without newline characters\n", "print(f\"Loaded {len(cleavageProject)} lines.\")\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "99100042-66c7-45e2-89e1-6f2b98cc7552", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded 91101 transcripts.\n" ] } ], "source": [ "from Bio import SeqIO\n", "\n", "# Define the path to your FASTA file\n", "fasta_file = './3utrvirus/TILE_mpra.fa'\n", "\n", "# Load each transcript sequence into a list\n", "utrvirus = [str(record.seq) for record in SeqIO.parse(fasta_file, \"fasta\")]\n", "\n", "print(f\"Loaded {len(utrvirus)} transcripts.\")" ] }, { "cell_type": "code", "execution_count": 4, "id": "159a34f2-041e-4c71-b3b5-3f663eeadd73", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded 378253 transcripts.\n" ] } ], "source": [ "\n", "# Define the path to your FASTA file\n", "fasta_file = './virus/RiboV1.4_Contigs.fasta'\n", "\n", "# Load each transcript sequence into a list\n", "virus = [str(record.seq) for record in SeqIO.parse(fasta_file, \"fasta\")]\n", "\n", "print(f\"Loaded {len(virus)} transcripts.\")" ] }, { "cell_type": "code", "execution_count": 41, "id": "7151e220-3073-45a9-974e-e93f522bc8be", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4615" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(virus[1])" ] }, { "cell_type": "code", "execution_count": 5, "id": "6f7554c1-65e7-4175-b8e9-9bcee459b3ae", "metadata": {}, "outputs": [], "source": [ "seqPoolList = ensemblPoolAnnotated+cleavageProject+utrvirus+virus\n", "seqPool = set()\n", "for i in seqPoolList:\n", " seqPool.add(i)\n", "seqPool = list(seqPool)" ] }, { "cell_type": "code", "execution_count": 11, "id": "364e95ce-33e2-46e9-9bef-9c22dd3b6c9f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5610734" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(seqPool)" ] }, { "cell_type": "code", "execution_count": 7, "id": "32725fcc-cd82-42c9-bf44-73d46ccf3902", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(G|i|(C|u3u|(G(G(A(U(U(UAGC(U(C(A|i||u3u|(G(U(G(G(UAGAGCG)C)C)AGA)C)U)G)A)A)G)A)U)C)U)G)C)CA\n" ] } ], "source": [ "import re\n", "import RNA\n", "\n", "def annotate_decorated_sequence(decorated_seq, structure):\n", " # Step 1: Extract base positions (ignore |...| decorations)\n", " base_positions = []\n", " pure_seq = ''\n", " i = 0\n", " while i < len(decorated_seq):\n", " if decorated_seq[i] == '|':\n", " j = decorated_seq.find('|', i+1)\n", " i = j + 1\n", " else:\n", " base_positions.append(i)\n", " pure_seq += decorated_seq[i]\n", " i += 1\n", "\n", " # Step 2: Pairing positions using structure\n", " stack = []\n", " pairs = {}\n", " for idx, s in enumerate(structure):\n", " if s == '(':\n", " stack.append(idx)\n", " elif s == ')':\n", " j = stack.pop()\n", " pairs[j] = idx\n", " pairs[idx] = j\n", "\n", " # Step 3: Insert parentheses into the decorated sequence\n", " annotated = []\n", " for i, char in enumerate(decorated_seq):\n", " if i in base_positions:\n", " base_idx = base_positions.index(i)\n", " if base_idx in pairs and base_idx < pairs[base_idx]:\n", " annotated.append('(')\n", " annotated.append(char)\n", " if base_idx in pairs and base_idx > pairs[base_idx]:\n", " annotated.append(')')\n", " else:\n", " annotated.append(char)\n", "\n", " return ''.join(annotated)\n", "\n", "# Example usage\n", "decorated = \"G|i|C|u3u|GGAUUUAGCUCA|i||u3u|GUGGUAGAGCGCCAGACUGAAGAUCUGCCA\"\n", "structure, energy = RNA.fold(decorated.replace('|u5u|','').replace('|u3u|','').replace('|t|','').replace('|s|','').replace('|i|',''))\n", "annotated = annotate_decorated_sequence(decorated, structure)\n", "print(annotated)" ] }, { "cell_type": "code", "execution_count": 9, "id": "a1f91f6d-6d62-4904-adae-7f1449d41ecb", "metadata": {}, "outputs": [], "source": [ "#dotbrackets = {}\n", "import json\n", "with open('dots.json') as tmpinputCollector:\n", " dotbrackets = json.load(tmpinputCollector)" ] }, { "cell_type": "code", "execution_count": 14, "id": "7a47cf29-d8bc-4ef2-a935-fa9dea3ee41a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ " 22%|██▏ | 1219235/5610734 [00:11<00:39, 110127.49it/s] \n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_1019222/3468054446.py\u001b[0m in \u001b[0;36m?\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mseq\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtqdm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mseqPool\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mseq\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdotbrackets\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mdotbrackets\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mseq\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menergy\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mRNA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mseq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'|u5u|'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'|u3u|'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'|t|'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'|s|'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'|i|'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/.local/lib/python3.11/site-packages/RNA/RNA.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(*args)\u001b[0m\n\u001b[1;32m 9339\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9340\u001b[0m \u001b[0mstructure\u001b[0m \u001b[0mRNA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold_compound\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0minstead\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9341\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9342\u001b[0m \"\"\"\n\u001b[0;32m-> 9343\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_RNA\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfold\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "from tqdm import tqdm\n", "seqPool.sort(key=len)\n", "\n", "\n", "for seq in tqdm(seqPool):\n", " if seq in dotbrackets: continue\n", " dotbrackets[seq], energy = RNA.fold(seq.replace('|u5u|','').replace('|u3u|','').replace('|t|','').replace('|s|','').replace('|i|',''))" ] }, { "cell_type": "code", "execution_count": 15, "id": "bbb53ac6-18c7-4219-8e80-c084a1429d80", "metadata": { "scrolled": true }, "outputs": [], "source": [ "with open(f\"dots.json\", \"w\") as outfile:\n", " json.dump(dotbrackets, outfile)" ] }, { "cell_type": "code", "execution_count": 90, "id": "8ccebba6-04bd-42dd-868f-bd109bf9e29b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('AAGTACCGGCGTGGCGGCGCCTCAGCCCGGCCTGGGCGAGCCCTGGGTGCTCCGCCGGGCAGCTCACGGCGCCCCGTATGGCCTGGGGATCCTAAGAGGCCCTGTGACCCCCCTCGCCTGGTCTCCCTCTCACCCCTGGAGGGTTGCCGCAGCTCCGGGGCCCCCGGGCAGGAAGGGCGCACTGGTCGTCCCGGGAGAGGG|i|GTCTGAGCAGAGGGCGGGGTGCAGGCGGAATGGCCCTCGTGCCCTATGAGGAGACCACGGAATTTGGGTTGCAGAAATTCCACAAGCCTCTTGCAACTTTTTCCTTTGCAAACCACACGATCCAGATCCGGCAGGACTGGAGACACCTGGGAGTCGCAGCGGTGGTTTGGGATGCG|i|GCCATCGTTCTTTCCACATACCTGGAGATGGGAGCTGTGGAGCTCAGGGGCCGCTCTGCCGTGGAGCTGGGTGCTGGCACGGGGCTGGTGGGCATAGTGGCTGCCCTGCTGG|i|CTGCTGCTTTCCAAAATTCGACAGGGAGCATGGGCAGGGGTGGTGGTTGAAAGTCTG',\n", " '....(((((((((.(((((((.(((((((((..(((((.(((((.((.(((((((.((((.(((...))))))).(.((((((...(.((((((((..((((((((((.((((((((.((((..(((((.((....)))))))..))))..))((((((((..((((((.(......))).))))..)))))))).)))))).....((((((((.((((((((((.((..(((((((((((...))))))).).))).(((((((.........))))))).....)).))))).))))).))))))))...(((.....(((((.(((....))))))))......)))..))))))).)))..)))))))).))))))))((((((((((......)))))...))))).))))))))).)))))))))).)))..)).))))))))))).)))...))))))((((.((((.(((((((((((.(.((((.(((((........)).))).))))).)))).))))))).))))...)))).')" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(dotbrackets.items())[-1]" ] }, { "cell_type": "code", "execution_count": 91, "id": "de5abb36-a0ad-47ce-a893-434dccfd6126", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "546" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len('....(((((((((.(((((((.(((((((((..(((((.(((((.((.(((((((.((((.(((...))))))).(.((((((...(.((((((((..((((((((((.((((((((.((((..(((((.((....)))))))..))))..))((((((((..((((((.(......))).))))..)))))))).)))))).....((((((((.((((((((((.((..(((((((((((...))))))).).))).(((((((.........))))))).....)).))))).))))).))))))))...(((.....(((((.(((....))))))))......)))..))))))).)))..)))))))).))))))))((((((((((......)))))...))))).))))))))).)))))))))).)))..)).))))))))))).)))...))))))((((.((((.(((((((((((.(.((((.(((((........)).))).))))).)))).))))))).))))...)))).')" ] }, { "cell_type": "code", "execution_count": 16, "id": "c29934bc-eff5-4c3a-a303-d3000fde57e7", "metadata": {}, "outputs": [], "source": [ "dotBracketsSeqTotal = []\n", "unBracketedSeqTotal = []\n", "for stuff in seqPool:\n", " if stuff in dotbrackets: dotBracketsSeqTotal.append(stuff)\n", " else: unBracketedSeqTotal.append(stuff)" ] }, { "cell_type": "code", "execution_count": 17, "id": "8df87404-5254-42af-be6e-943d793411f9", "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "random.shuffle(dotBracketsSeqTotal)\n", "\n", "# Split into 5 as evenly as possible\n", "def split_into_chunks(lst, n_chunks):\n", " k, m = divmod(len(lst), n_chunks)\n", " return [lst[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n_chunks)]\n", "\n", "splits = split_into_chunks(dotBracketsSeqTotal, 5)" ] }, { "cell_type": "code", "execution_count": 103, "id": "fde528d7-f154-4274-8ef3-f57e671f18f7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'ATGAAAATTATCAAACTAGTGAGGTTAATTGTGACTAAACCACAAAACACACACACTGTACGTGTGTGGATCGACCTGGAGCAAAGAAAAACAAGGGTTTACCCTTGTTTTCATCAAATTCACCAAATTGACAAGGAAAAATCGATGTTTATCAGTTGCATGTAGTAAAATTTCGATCATCTACCCATACCCGGTGAAGTG|i|GTGTGAAGGAAGAAGGTTCAAATTCTAAGAAATTGGAAGGATCACAAGACCGAG|i|GTAAATCCTCGACTTAGGCGTATGGACGGCTTGGAACGTGCACACTTGATCTACGCCCGCCTCACGCTTCCGTCACAAATTATTTTGATATGGGTTAAGTTTTGGTCATATGTATTTAAGCTTATGTAGTATGTCGATATCCTTGTCGTTGGGTAAAAACTTAGTAGTTGAAGTCATGTCGTGTCCAATGTAAACTTTGTCCGTCTTGGGTTTTGTCAAAGATGTTAAATGTCGAAGTTTGTTTGTGTAAAACAGGTTGTTAATAGTTTTAAATGAATAGGTCATGCCGAAATT'" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "splits[4][5]" ] }, { "cell_type": "code", "execution_count": null, "id": "4e26022b-1bc5-425b-b1c9-fa5732705da5", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 18, "id": "c7d44143-3197-4d16-8740-582334831015", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 243847/243847 [06:40<00:00, 608.91it/s]\n" ] } ], "source": [ "# we would like to construct 5 categories: \n", "# 1. dot-bracket annotated sequences only for global understanding (split1)\n", "# 2. sequences to dot bracket prediction for dynamics understanding (split2)\n", "# 3. dot-bracket annotated sequences to dot bracket for in context fidelity(split3)\n", "# 4. dot-bracket prediction to sequence for model to be creative at designing its own sequence(split4)\n", "# 5. annotated sequences only(unBracketedSeqTotal)\n", "# 6. sequences to inline dot bracket prediction(split5)\n", "\n", "split1 = []\n", "split2 = []\n", "split3 = []\n", "split4 = []\n", "split6 = []\n", "\n", "for seq in tqdm(splits[0]):\n", " dots = dotbrackets[seq]\n", " fullSequence = annotate_decorated_sequence(seq,dots)\n", " split1.append(fullSequence)\n", "\n", "for seq in splits[1]:\n", " dots = dotbrackets[seq]\n", " dottedSeq = annotate_decorated_sequence(seq,dots)\n", " fullSequence = f'{seq}~$predict_dot_bracket_sequence\\n{dottedSeq}'\n", " split2.append(fullSequence)\n", "\n", "for seq in splits[2]:\n", " dots = dotbrackets[seq]\n", " dottedSeq = annotate_decorated_sequence(seq,dots)\n", " fullSequence = f'{dottedSeq}~$get_pure_dot_bracket_representation\\n{dots}'\n", " split3.append(fullSequence)\n", "\n", "for seq in splits[3]:\n", " dots = dotbrackets[seq]\n", " dottedSeq = annotate_decorated_sequence(seq,dots)\n", " fullSequence = f'{dots}~$design_sequence_from_given_dots\\n{dottedSeq}'\n", " split4.append(fullSequence)\n", "\n", "for seq in splits[4]:\n", " dots = dotbrackets[seq]\n", " dottedSeq = annotate_decorated_sequence(seq,dots)\n", " fullSequence = f'{seq}~$predict_pure_dot_bracket\\n{dots}'\n", " split6.append(fullSequence)" ] }, { "cell_type": "code", "execution_count": 20, "id": "3897cfca-918b-4259-a746-9047641bbb2d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'(G(GTAA(G(C(G(G(G(G(C(G(C(G(CC(G(G(G(G(C(T(GC(G(CC(G(C(T(G(CCCCCTCCCG)C)G)G)C)TCCT(G(G(C(C(GGCCGC)G)G)C)C)G)C)TTC)A)G)C)C)T)C)TG)C)G)C)AG(G(G(C(G(G(C(C(G(G(G(G(GCA(G(GATCCCGTGC)C)AAC)C)C)C)C)G)AG)C)C)AG)C)T)(G(G(GA(C(AAAGCT)G)AC)C)C)TG)C)C)T)C)G)C)CTC)C)(A(G|i|(A(C(T(A(T(C(A(T(C(T(C(T(A(C(T(AATACATAAAATAATAACAAAGTAATTCTTCAACT)G)G)T)G)G)A)G)CAACA(G(A(A(G(CAACG)|i|T)T)T)C)CACA)T)G)CA)T)A)CG)T)C)T)TAC'" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "split1[666]" ] }, { "cell_type": "code", "execution_count": 21, "id": "d2dde075-b492-421e-a562-633cdc43439a", "metadata": {}, "outputs": [], "source": [ "import json\n", "# we would like to construct 5 categories: \n", "# 1. dot-bracket annotated sequences only for global understanding (split1)\n", "# 2. sequences to dot bracket prediction for dynamics understanding (split2)\n", "# 3. dot-bracket annotated sequences to dot bracket for in context fidelity(split3)\n", "# 4. dot-bracket prediction to sequence for model to be creative at designing its own sequence(split4)\n", "# 5. annotated sequences only(unBracketedSeqTotal)\n", "# 6. sequences to inline dot bracket prediction(split6)\n", "\n", "\n", "with open(f\"split1.json\", \"w\") as outfile:\n", " json.dump(split1, outfile)\n", "\n", "with open(f\"split2.json\", \"w\") as outfile:\n", " json.dump(split2, outfile)\n", "\n", "with open(f\"split3.json\", \"w\") as outfile:\n", " json.dump(split3, outfile)\n", "\n", "with open(f\"split4.json\", \"w\") as outfile:\n", " json.dump(split4, outfile)\n", "\n", "with open(f\"split5.json\", \"w\") as outfile:\n", " json.dump(unBracketedSeqTotal, outfile)\n", "\n", "with open(f\"split6.json\", \"w\") as outfile:\n", " json.dump(split6, outfile)" ] }, { "cell_type": "code", "execution_count": 19, "id": "9fc206d3-cb67-4137-9525-39d86d888392", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5771083" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(seqPoolList)" ] }, { "cell_type": "code", "execution_count": 50, "id": "91dfd9d1-289b-4d5f-828f-59a2150b46df", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'((((((((...((((((((.....)))..)))))))))))))..'" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "structure" ] }, { "cell_type": "code", "execution_count": null, "id": "3d8bec72-16a2-494e-bcbd-d35819eb7bb9", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.3" } }, "nbformat": 4, "nbformat_minor": 5 }