prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Doubly jagged workaround broken in awkward 1.4.0rc2
  There was a quick fix (made for KM3NeT data 😄) for doubly jagged arrays which were discussed here https://github.com/scikit-hep/uproot4/issues/90 and the it uses the `akward._io` submodule which is not accessible anymore directly (`AttributeError`) in `1.4.0rc2`.
  
  See here:
  
  https://github.com/scikit-hep/awkward-1.0/blob/main/src/awkward/_connect/_uproot.py#L35
  
  I am not sure what the desired fix is, to import `_io` in `_connect/_uproot.py` or if this fix is now covered by further developments, so I thought I ask first before I do a PR 😉 
  
  Here is the full MWE (needs `pip install km3net-testdata`, I am not sure if this test
  
  ```python
  >>> import uproot
  
  >>> uproot.__version__
  '4.0.7'
  
  >>> import awkward as ak
  
  >>> ak.__version__
  '1.4.0rc2'
  
  >>> from km3net_testdata import data_path
  
  >>> f = uproot.open(data_path("offline/mcv5.11r2.gsg_muonCChigherE-CC_50-5000GeV.km3_AAv1.jterbr00004695.jchain.aanet.498.root"))
  
  >>> f["E/Evt/trks/trks.rec_stages"].array()
  ---------------------------------------------------------------------------
  AttributeError                            Traceback (most recent call last)
  <ipython-input-18-80472509fad7> in <module>
  ----> 1 f["E/Evt/trks/trks.rec_stages"].array()
  
  ~/Dev/km3io/venv/lib/python3.9/site-packages/uproot/behaviors/TBranch.py in array(self, interpretation, entry_start, entry_stop, decompression_executor, interpretation_executor, array_cache, library)
     2076                         ranges_or_baskets.append((branch, basket_num, range_or_basket))
     2077
  -> 2078         _ranges_or_baskets_to_arrays(
     2079             self,
     2080             ranges_or_baskets,
  
  ~/Dev/km3io/venv/lib/python3.9/site-packages/uproot/behaviors/TBranch.py in _ranges_or_baskets_to_arrays(hasbranches, ranges_or_baskets, branchid_interpretation, entry_start, entry_stop, decompression_executor, interpretation_executor, library, arrays, update_ranges_or_baskets)
     3476
     3477         elif isinstance(obj, tuple) and len(obj) == 3:
  -> 3478             uproot.source.futures.delayed_raise(*obj)
     3479
     3480         else:
  
  ~/Dev/km3io/venv/lib/python3.9/site-packages/uproot/source/futures.py in delayed_raise(exception_class, exception_value, traceback)
       44         exec("raise exception_class, exception_value, traceback")
       45     else:
  ---> 46         raise exception_value.with_traceback(traceback)
       47
       48
  
  ~/Dev/km3io/venv/lib/python3.9/site-packages/uproot/behaviors/TBranch.py in basket_to_array(basket)
     3420             basket_arrays = branchid_arrays[branch.cache_key]
     3421
  -> 3422             basket_arrays[basket.basket_num] = interpretation.basket_array(
     3423                 basket.data,
     3424                 basket.byte_offsets,
  
  ~/Dev/km3io/venv/lib/python3.9/site-packages/uproot/interpretation/objects.py in basket_array(self, data, byte_offsets, basket, branch, context, cursor_offset, library)
      151                     "cursor_offset": cursor_offset,
      152                 }
  --> 153                 output = awkward._connect._uproot.basket_array(
      154                     form, data, byte_offsets, extra
      155                 )
  
  ~/Dev/km3io/venv/lib/python3.9/site-packages/awkward/_connect/_uproot.py in basket_array(form, data, byte_offsets, extra)
       36     # FIXME: uproot_issue_90 is just a placeholder, to show how it would be done
       37
  ---> 38     return ak._io.uproot_issue_90(
       39         form,
       40         ak.layout.NumpyArray(data),
  
  AttributeError: module 'awkward' has no attribute '_io'
  ```
  
  
  
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `src/awkward/_connect/_uproot.py`
  Content:
  ```
  1 # BSD 3-Clause License; see https://github.com/scikit-hep/awkward-1.0/blob/main/LICENSE
  2 
  3 from __future__ import absolute_import
  4 
  5 import json
  6 
  7 # don't import awkward._connect._uproot in awkward/__init__.py!
  8 import uproot
  9 
  10 import awkward as ak
  11 
  12 
  13 def can_optimize(interpretation, form):
  14     if isinstance(interpretation, uproot.interpretation.objects.AsObjects):
  15         jsonform = json.loads(form.tojson(verbose=True))
  16         if (
  17             jsonform["class"] == "ListOffsetArray64"
  18             and jsonform["parameters"].get("uproot")
  19             == {"as": "array", "header": True, "speedbump": False}
  20             and jsonform["content"]["class"] == "ListOffsetArray64"
  21             and jsonform["content"]["parameters"].get("uproot")
  22             == {"as": "vector", "header": False}
  23             and jsonform["content"]["content"]["class"] == "NumpyArray"
  24             and jsonform["content"]["content"]["inner_shape"] == []
  25             and (
  26                 jsonform["content"]["content"].get("primitive") == "float64"
  27                 or jsonform["content"]["content"].get("primitive") == "int32"
  28             )
  29         ):
  30             return True
  31 
  32     return False
  33 
  34 
  35 def basket_array(form, data, byte_offsets, extra):
  36     # FIXME: uproot_issue_90 is just a placeholder, to show how it would be done
  37 
  38     return ak._io.uproot_issue_90(
  39         form,
  40         ak.layout.NumpyArray(data),
  41         ak.layout.Index32(byte_offsets),
  42     )
  43
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/src/awkward/_connect/_uproot.py b/src/awkward/_connect/_uproot.py
  --- a/src/awkward/_connect/_uproot.py
  +++ b/src/awkward/_connect/_uproot.py
  @@ -33,9 +33,11 @@
   
   
   def basket_array(form, data, byte_offsets, extra):
  +    import awkward._io
  +
       # FIXME: uproot_issue_90 is just a placeholder, to show how it would be done
   
  -    return ak._io.uproot_issue_90(
  +    return awkward._io.uproot_issue_90(
           form,
           ak.layout.NumpyArray(data),
           ak.layout.Index32(byte_offsets),
  
verification_info: {"golden_diff": "diff --git a/src/awkward/_connect/_uproot.py b/src/awkward/_connect/_uproot.py\n--- a/src/awkward/_connect/_uproot.py\n+++ b/src/awkward/_connect/_uproot.py\n@@ -33,9 +33,11 @@\n \n \n def basket_array(form, data, byte_offsets, extra):\n+    import awkward._io\n+\n     # FIXME: uproot_issue_90 is just a placeholder, to show how it would be done\n \n-    return ak._io.uproot_issue_90(\n+    return awkward._io.uproot_issue_90(\n         form,\n         ak.layout.NumpyArray(data),\n         ak.layout.Index32(byte_offsets),\n", "issue": "Doubly jagged workaround broken in awkward 1.4.0rc2\nThere was a quick fix (made for KM3NeT data \ud83d\ude04) for doubly jagged arrays which were discussed here https://github.com/scikit-hep/uproot4/issues/90 and the it uses the `akward._io` submodule which is not accessible anymore directly (`AttributeError`) in `1.4.0rc2`.\r\n\r\nSee here:\r\n\r\nhttps://github.com/scikit-hep/awkward-1.0/blob/main/src/awkward/_connect/_uproot.py#L35\r\n\r\nI am not sure what the desired fix is, to import `_io` in `_connect/_uproot.py` or if this fix is now covered by further developments, so I thought I ask first before I do a PR \ud83d\ude09 \r\n\r\nHere is the full MWE (needs `pip install km3net-testdata`, I am not sure if this test\r\n\r\n```python\r\n>>> import uproot\r\n\r\n>>> uproot.__version__\r\n'4.0.7'\r\n\r\n>>> import awkward as ak\r\n\r\n>>> ak.__version__\r\n'1.4.0rc2'\r\n\r\n>>> from km3net_testdata import data_path\r\n\r\n>>> f = uproot.open(data_path(\"offline/mcv5.11r2.gsg_muonCChigherE-CC_50-5000GeV.km3_AAv1.jterbr00004695.jchain.aanet.498.root\"))\r\n\r\n>>> f[\"E/Evt/trks/trks.rec_stages\"].array()\r\n---------------------------------------------------------------------------\r\nAttributeError                            Traceback (most recent call last)\r\n<ipython-input-18-80472509fad7> in <module>\r\n----> 1 f[\"E/Evt/trks/trks.rec_stages\"].array()\r\n\r\n~/Dev/km3io/venv/lib/python3.9/site-packages/uproot/behaviors/TBranch.py in array(self, interpretation, entry_start, entry_stop, decompression_executor, interpretation_executor, array_cache, library)\r\n   2076                         ranges_or_baskets.append((branch, basket_num, range_or_basket))\r\n   2077\r\n-> 2078         _ranges_or_baskets_to_arrays(\r\n   2079             self,\r\n   2080             ranges_or_baskets,\r\n\r\n~/Dev/km3io/venv/lib/python3.9/site-packages/uproot/behaviors/TBranch.py in _ranges_or_baskets_to_arrays(hasbranches, ranges_or_baskets, branchid_interpretation, entry_start, entry_stop, decompression_executor, interpretation_executor, library, arrays, update_ranges_or_baskets)\r\n   3476\r\n   3477         elif isinstance(obj, tuple) and len(obj) == 3:\r\n-> 3478             uproot.source.futures.delayed_raise(*obj)\r\n   3479\r\n   3480         else:\r\n\r\n~/Dev/km3io/venv/lib/python3.9/site-packages/uproot/source/futures.py in delayed_raise(exception_class, exception_value, traceback)\r\n     44         exec(\"raise exception_class, exception_value, traceback\")\r\n     45     else:\r\n---> 46         raise exception_value.with_traceback(traceback)\r\n     47\r\n     48\r\n\r\n~/Dev/km3io/venv/lib/python3.9/site-packages/uproot/behaviors/TBranch.py in basket_to_array(basket)\r\n   3420             basket_arrays = branchid_arrays[branch.cache_key]\r\n   3421\r\n-> 3422             basket_arrays[basket.basket_num] = interpretation.basket_array(\r\n   3423                 basket.data,\r\n   3424                 basket.byte_offsets,\r\n\r\n~/Dev/km3io/venv/lib/python3.9/site-packages/uproot/interpretation/objects.py in basket_array(self, data, byte_offsets, basket, branch, context, cursor_offset, library)\r\n    151                     \"cursor_offset\": cursor_offset,\r\n    152                 }\r\n--> 153                 output = awkward._connect._uproot.basket_array(\r\n    154                     form, data, byte_offsets, extra\r\n    155                 )\r\n\r\n~/Dev/km3io/venv/lib/python3.9/site-packages/awkward/_connect/_uproot.py in basket_array(form, data, byte_offsets, extra)\r\n     36     # FIXME: uproot_issue_90 is just a placeholder, to show how it would be done\r\n     37\r\n---> 38     return ak._io.uproot_issue_90(\r\n     39         form,\r\n     40         ak.layout.NumpyArray(data),\r\n\r\nAttributeError: module 'awkward' has no attribute '_io'\r\n```\r\n\r\n\r\n\n", "before_files": [{"content": "# BSD 3-Clause License; see https://github.com/scikit-hep/awkward-1.0/blob/main/LICENSE\n\nfrom __future__ import absolute_import\n\nimport json\n\n# don't import awkward._connect._uproot in awkward/__init__.py!\nimport uproot\n\nimport awkward as ak\n\n\ndef can_optimize(interpretation, form):\n    if isinstance(interpretation, uproot.interpretation.objects.AsObjects):\n        jsonform = json.loads(form.tojson(verbose=True))\n        if (\n            jsonform[\"class\"] == \"ListOffsetArray64\"\n            and jsonform[\"parameters\"].get(\"uproot\")\n            == {\"as\": \"array\", \"header\": True, \"speedbump\": False}\n            and jsonform[\"content\"][\"class\"] == \"ListOffsetArray64\"\n            and jsonform[\"content\"][\"parameters\"].get(\"uproot\")\n            == {\"as\": \"vector\", \"header\": False}\n            and jsonform[\"content\"][\"content\"][\"class\"] == \"NumpyArray\"\n            and jsonform[\"content\"][\"content\"][\"inner_shape\"] == []\n            and (\n                jsonform[\"content\"][\"content\"].get(\"primitive\") == \"float64\"\n                or jsonform[\"content\"][\"content\"].get(\"primitive\") == \"int32\"\n            )\n        ):\n            return True\n\n    return False\n\n\ndef basket_array(form, data, byte_offsets, extra):\n    # FIXME: uproot_issue_90 is just a placeholder, to show how it would be done\n\n    return ak._io.uproot_issue_90(\n        form,\n        ak.layout.NumpyArray(data),\n        ak.layout.Index32(byte_offsets),\n    )\n", "path": "src/awkward/_connect/_uproot.py"}], "after_files": [{"content": "# BSD 3-Clause License; see https://github.com/scikit-hep/awkward-1.0/blob/main/LICENSE\n\nfrom __future__ import absolute_import\n\nimport json\n\n# don't import awkward._connect._uproot in awkward/__init__.py!\nimport uproot\n\nimport awkward as ak\n\n\ndef can_optimize(interpretation, form):\n    if isinstance(interpretation, uproot.interpretation.objects.AsObjects):\n        jsonform = json.loads(form.tojson(verbose=True))\n        if (\n            jsonform[\"class\"] == \"ListOffsetArray64\"\n            and jsonform[\"parameters\"].get(\"uproot\")\n            == {\"as\": \"array\", \"header\": True, \"speedbump\": False}\n            and jsonform[\"content\"][\"class\"] == \"ListOffsetArray64\"\n            and jsonform[\"content\"][\"parameters\"].get(\"uproot\")\n            == {\"as\": \"vector\", \"header\": False}\n            and jsonform[\"content\"][\"content\"][\"class\"] == \"NumpyArray\"\n            and jsonform[\"content\"][\"content\"][\"inner_shape\"] == []\n            and (\n                jsonform[\"content\"][\"content\"].get(\"primitive\") == \"float64\"\n                or jsonform[\"content\"][\"content\"].get(\"primitive\") == \"int32\"\n            )\n        ):\n            return True\n\n    return False\n\n\ndef basket_array(form, data, byte_offsets, extra):\n    import awkward._io\n\n    # FIXME: uproot_issue_90 is just a placeholder, to show how it would be done\n\n    return awkward._io.uproot_issue_90(\n        form,\n        ak.layout.NumpyArray(data),\n        ak.layout.Index32(byte_offsets),\n    )\n", "path": "src/awkward/_connect/_uproot.py"}]}