144c7d1473d842b6bba64e82c8ce47ae

Use DatasetExplorer to navigate the dataset

The dataset module provides objects for exploring, navigating, and loading CAD-encoded datasets for machine learning applications. It consists of two primary components that work together to simplify data handling:

  1. DatasetExplorer - For exploring and querying dataset contents

  2. DatasetLoader - For loading and preparing datasets for machine learning training

These components are designed to work with processed data from the cadaccess and cadencoder modules, as well as the outputs from the flow pipeline system. They provide high-level abstractions that let users focus on machine learning tasks rather than data-handling complexity.

DatasetExplorer

The DatasetExplorer class (dataset_explorer.py) provides methods for exploring and querying datasets stored in a compressed and optimized format (.dataset) with accompanying metadata (.infoset) files. This class focuses on data discovery, filtering, and statistical analysis.

Key Methods

Data Discovery and Metadata

  • available_groups() -> set: Returns the set of available dataset groups (faces, edges, file, etc.)

  • get_descriptions(table_name: str, key_id: Optional[int] = None, use_wildchar: Optional[bool] = False) -> pd.DataFrame: Retrieves metadata descriptions (labels, face types, edge types, etc.)

  • get_parquet_info_by_code(file_id_code: int): Returns rows from the Parquet file for a specific file ID code

  • get_file_info_all() -> pd.DataFrame: Returns all file info from the Parquet metadata

Data Distribution Analysis

  • create_distribution(key: str, bins: int = 10, group: str = "faces") -> Dict[str, Any]: Computes histograms of data distributions using Dask for parallel processing

Data Filtering and Selection

  • get_file_list(group: str, where: Callable[[xr.Dataset], xr.DataArray]) -> List[str]: Returns file IDs matching a boolean filter condition

  • file_dataset(file_id_code: int, group: str) -> xr.Dataset: Returns a subset of the dataset for a specific file

  • build_membership_matrix(group: str, key: str, bins_or_categories: Union[int, List, np.ndarray], as_counts: bool = False) -> tuple[np.ndarray, np.ndarray, np.ndarray]: Builds a file-by-bin membership matrix for stratified splitting

  • decode_file_id_code(code: int) -> str: Converts an integer file ID code to the original string identifier

[1]:
import hoops_ai
import os
import sys

license_key = os.environ.get("HOOPS_AI_LICENSE")
if not license_key:
    sys.exit("HOOPS_AI_LICENSE environment variable is required.")

hoops_ai.set_license(license_key, validate=True)
------------------------------------------------------------
HOOPS AI
------------------------------------------------------------
  Platform      : Windows 11
  Architecture  : AMD64
  Python        : 3.9.21
------------------------------------------------------------
  Core          : hoops-ai             1.0.0  (build: 39b99a8 2026-03-23T19:25:21Z)
  CAD Access    : hoops-exchange       26.2.0  (build: 1e11169 2026-03-23T19:16:49Z)
  Conversion    : hoops-converter      26.1.0  (build: 39b99a8 2026-03-23T19:15:42Z)
  Insights      : hoops-web-viewer     26.1.0  (build: 25137b2 2026-03-23T19:20:34Z)
------------------------------------------------------------
======================================================================
[OK] HOOPS AI License: Valid
======================================================================
[2]:
from hoops_ai.dataset import DatasetExplorer
import pathlib
# Define paths
flow_name = "ETL_Fabwave_training_b2"

flow_root_dir = pathlib.Path.cwd().parent.joinpath("packages", "flows", flow_name)
print(flow_root_dir)

parquet_file_path        = str(flow_root_dir.joinpath(f"{flow_name}.infoset"))
merged_store_path     = str(flow_root_dir.joinpath(f"{flow_name}.dataset"))
parquet_file_attribs  = str(flow_root_dir.joinpath(f"{flow_name}.attribset"))


explorer = DatasetExplorer(merged_store_path=merged_store_path, parquet_file_path=parquet_file_path, parquet_file_attribs=parquet_file_attribs)
explorer.print_table_of_contents()
INFO:To route to workers diagnostics web server please install jupyter-server-proxy: python -m pip install jupyter-server-proxy
INFO:State start
C:\Users\LuisSalazar.LY-LS-LEGION\Documents\repos\HOOPS-AI-tutorials\packages\flows\ETL_Fabwave_training_b2
INFO:  Scheduler at:     tcp://127.0.0.1:55444
INFO:  dashboard at:  http://127.0.0.1:58574/status
INFO:Registering Worker plugin shuffle
INFO:        Start Nanny at: 'tcp://127.0.0.1:55447'
INFO:Register worker <WorkerState 'tcp://127.0.0.1:62400', name: 0, status: init, memory: 0, processing: 0>
INFO:Starting worker compute stream, tcp://127.0.0.1:62400
INFO:Starting established connection to tcp://127.0.0.1:62402
INFO:Receive client connection: Client-47dd1e42-2854-11f1-8bc8-f4289de57fc2
INFO:Starting established connection to tcp://127.0.0.1:62403
[DatasetExplorer] Default local cluster started: <Client: 'tcp://127.0.0.1:55444' processes=1 threads=16, memory=7.45 GiB>

--- Dataset Table of Contents ---

LABELS_GROUP:
  FILE_ID_CODE_LABELS_DATA: Shape: (4533,), Dims: ('Labels_part_label_dim_0',), Size: 4533
  PART_LABEL_DATA: Shape: (4533,), Dims: ('Labels_part_label_dim_0',), Size: 4533

EDGES_GROUP:
  EDGE_CONVEXITIES_DATA: Shape: (314766,), Dims: ('edge',), Size: 314766
  EDGE_DIHEDRAL_ANGLES_DATA: Shape: (314766,), Dims: ('edge',), Size: 314766
  EDGE_INDICES_DATA: Shape: (314766,), Dims: ('edge',), Size: 314766
  EDGE_LENGTHS_DATA: Shape: (314766,), Dims: ('edge',), Size: 314766
  EDGE_TYPES_DATA: Shape: (314766,), Dims: ('edge',), Size: 314766
  EDGE_U_GRIDS_DATA: Shape: (314766, 10, 6), Dims: ('edge', 'dim_x', 'component'), Size: 18885960
  FILE_ID_CODE_EDGES_DATA: Shape: (314766,), Dims: ('edge',), Size: 314766

FACE_MESH_GROUP:
  FACE_MESH_ADJ_DATA: Shape: (122099, 10000), Dims: ('face', 'component'), Size: 1220990000
  FILE_ID_CODE_FACE_MESH_DATA: Shape: (122099,), Dims: ('face',), Size: 122099

FACES_GROUP:
  FACE_AREAS_DATA: Shape: (122099,), Dims: ('face',), Size: 122099
  FACE_DISCRETIZATION_DATA: Shape: (122099, 100, 7), Dims: ('face', 'sample', 'component'), Size: 85469300
  FACE_INDICES_DATA: Shape: (122099,), Dims: ('face',), Size: 122099
  FACE_LOOPS_DATA: Shape: (122099,), Dims: ('face',), Size: 122099
  FACE_TYPES_DATA: Shape: (122099,), Dims: ('face',), Size: 122099
  FILE_ID_CODE_FACES_DATA: Shape: (122099,), Dims: ('face',), Size: 122099

GRAPH_GROUP:
  EDGES_DESTINATION_DATA: Shape: (314766,), Dims: ('edge',), Size: 314766
  EDGES_SOURCE_DATA: Shape: (314766,), Dims: ('edge',), Size: 314766
  FILE_ID_CODE_GRAPH_DATA: Shape: (314766,), Dims: ('edge',), Size: 314766
  NUM_NODES_DATA: Shape: (314766,), Dims: ('edge',), Size: 314766
==================================
Columns in file_info:
                                  name    id                             description                        stream_cache_png                         stream_cache_3d subset table_name
0     000a77de069a7d4fb2702221894260de     0  ...ab0-8bf2-4de3-9b50-63097d804a88.stp  ...00a77de069a7d4fb2702221894260de.png  ...00a77de069a7d4fb2702221894260de.scs    N/A  file_info
1     0012103a74fd61159e196873fae8b017     1  ...734-8827-47a4-b782-75b763a2046d.stp  ...012103a74fd61159e196873fae8b017.png  ...012103a74fd61159e196873fae8b017.scs    N/A  file_info
2     002acb1c8285365cfc2238a7f3065ab4     2  ...a83-9f65-43d0-83b9-18f64773ad03.stp  ...02acb1c8285365cfc2238a7f3065ab4.png  ...02acb1c8285365cfc2238a7f3065ab4.scs    N/A  file_info
3     005dd7f6e96ea14c721996e6cb64a15d     3  ...621-b4d1-4a36-b5df-6bfdca105868.stp  ...05dd7f6e96ea14c721996e6cb64a15d.png  ...05dd7f6e96ea14c721996e6cb64a15d.scs    N/A  file_info
4     0065edf9ef148b36972db4738574eeb3     4  ...711-2bdf-46c1-81a1-393c7dd1cef9.stp  ...065edf9ef148b36972db4738574eeb3.png  ...065edf9ef148b36972db4738574eeb3.scs    N/A  file_info
5     00880e0179bca356cdb7f40c889b9d6a     5  ...e49-1428-41d3-9649-313c1449cdc9.stp  ...0880e0179bca356cdb7f40c889b9d6a.png  ...0880e0179bca356cdb7f40c889b9d6a.scs    N/A  file_info
6     008ada2154252d79efddc26101727702     6  ...b67-81fe-444a-abea-1c820ead73cb.stp  ...08ada2154252d79efddc26101727702.png  ...08ada2154252d79efddc26101727702.scs    N/A  file_info
7     00980632d28776a96f9f0dbfb3668cbb     7  ...e34-56a7-41eb-903c-f236c3053891.stp  ...0980632d28776a96f9f0dbfb3668cbb.png  ...0980632d28776a96f9f0dbfb3668cbb.scs    N/A  file_info
8     00a083bc9fd6562a38a21486bb962963     8  ...54e-ea62-4ef3-96b1-a951f0f12940.stp  ...0a083bc9fd6562a38a21486bb962963.png  ...0a083bc9fd6562a38a21486bb962963.scs    N/A  file_info
9     00bff01b348205658a5c69689ffc3e7d     9  ...f71-c886-4b65-a620-e4d1f2055525.stp  ...0bff01b348205658a5c69689ffc3e7d.png  ...0bff01b348205658a5c69689ffc3e7d.scs    N/A  file_info
...                                ...   ...                                     ...                                     ...                                     ...    ...        ...
4518  ff838e32f4eeafc88b7d202ea45504c9  4510  ...cbc-e489-4473-bb97-a7c2dbb9bf3a.stp  ...f838e32f4eeafc88b7d202ea45504c9.png  ...f838e32f4eeafc88b7d202ea45504c9.scs    N/A  file_info
4519  ff9cc90d891b25915f9cae06f92adc85  4511  ...ipe_Fittings\STEP\raipipemodel5.stp  ...f9cc90d891b25915f9cae06f92adc85.png  ...f9cc90d891b25915f9cae06f92adc85.scs    N/A  file_info
4520  ff9dd202e3ca8dcd56e86d05663e995a  4512  ...gs\STEP\exammodelsankuranubhav1.stp  ...f9dd202e3ca8dcd56e86d05663e995a.png  ...f9dd202e3ca8dcd56e86d05663e995a.scs    N/A  file_info
4521  ffa9911456c8e20a6f1c57ac687a96a9  4513  ...577-78db-40cc-b821-c9dcb0039204.stp  ...fa9911456c8e20a6f1c57ac687a96a9.png  ...fa9911456c8e20a6f1c57ac687a96a9.scs    N/A  file_info
4522  ffacd39925253e741d02f8a8f32986c7  4514  ...8e9-ba4e-4b89-ab4e-881ce2888e5f.stp  ...facd39925253e741d02f8a8f32986c7.png  ...facd39925253e741d02f8a8f32986c7.scs    N/A  file_info
4523  ffc390f44ba5021d726f901372fc839d  4515  ...d01-1e1a-4a76-ab84-ab6408fe29ad.stp  ...fc390f44ba5021d726f901372fc839d.png  ...fc390f44ba5021d726f901372fc839d.scs    N/A  file_info
4524  ffc59b39fec14489c11354a48f15847f  4516  ...f01-5001-48d9-a01d-52d624970bb3.stp  ...fc59b39fec14489c11354a48f15847f.png  ...fc59b39fec14489c11354a48f15847f.scs    N/A  file_info
4525  ffcb7848d987b4a017553f22c32298d2  4517  ...efe-7377-456c-85b3-d52e91a1485d.stp  ...fcb7848d987b4a017553f22c32298d2.png  ...fcb7848d987b4a017553f22c32298d2.scs    N/A  file_info
4526  ffdeb6f55bff6417aeba046b99646cd5  4518  ...57f-2d7d-41bd-9241-fb74fbd1e8c4.stp  ...fdeb6f55bff6417aeba046b99646cd5.png  ...fdeb6f55bff6417aeba046b99646cd5.scs    N/A  file_info
4527  ffe808ee94bb4079065835db0aa09d71  4519  ...7e3-a97e-4c29-a6fa-141e75a5979f.stp  ...fe808ee94bb4079065835db0aa09d71.png  ...fe808ee94bb4079065835db0aa09d71.scs    N/A  file_info
[3]:
explorer.get_file_info_all()
[3]:
name id description stream_cache_png stream_cache_3d subset table_name
0 000a77de069a7d4fb2702221894260de 0 C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... N/A file_info
1 0012103a74fd61159e196873fae8b017 1 C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... N/A file_info
2 002acb1c8285365cfc2238a7f3065ab4 2 C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... N/A file_info
3 005dd7f6e96ea14c721996e6cb64a15d 3 C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... N/A file_info
4 0065edf9ef148b36972db4738574eeb3 4 C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... N/A file_info
... ... ... ... ... ... ... ...
4523 ffc390f44ba5021d726f901372fc839d 4515 C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... N/A file_info
4524 ffc59b39fec14489c11354a48f15847f 4516 C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... N/A file_info
4525 ffcb7848d987b4a017553f22c32298d2 4517 C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... N/A file_info
4526 ffdeb6f55bff6417aeba046b99646cd5 4518 C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... N/A file_info
4527 ffe808ee94bb4079065835db0aa09d71 4519 C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor... N/A file_info

4528 rows × 7 columns

[4]:
groups = explorer.available_groups()
print(groups)
{'faces', 'graph', 'Labels', 'edges', 'face_mesh'}
[5]:
face_type_description = explorer.get_descriptions("face_types")
print(type(face_type_description), face_type_description)
<class 'pandas.core.frame.DataFrame'>       id      name description  table_name
13628  1  Cylinder     not set  face_types
13629  0     Plane     not set  face_types
13630  2      Cone     not set  face_types
13631  4     Torus     not set  face_types
13632  5     Nurbs     not set  face_types
13633  3    Sphere     not set  face_types
[6]:
import time
from scripts import helper_tutorials
start_time = time.time()
dist = explorer.create_distribution(key="num_nodes", bins=12, group="graph")
print(f"BRep face-count distribution created in {(time.time() - start_time):.2f} seconds\n")
helper_tutorials.print_distribution_info(dist, title="BRep face-count distribution")
BRep face-count distribution created in 0.41 seconds

../../../_images/tutorials_hoops_ai_tutorials_notebooks_4a_5k_dataserving_7_1.png
[7]:
largest_files = dist['file_id_codes_in_bins'][9]

Dataset Visualization with DatasetViewer

The DatasetViewer is a powerful visualization tool that bridges dataset queries and visual analysis. It enables you to quickly visualize query results in two ways:

  1. Image Grids: Generate collages of PNG previews for rapid visual scanning

  2. Interactive 3D Views: Open inline 3D viewers for detailed model inspection

[8]:
# Import the DatasetViewer from the insights module
from hoops_ai.insights import DatasetViewer

dataset_viewer = DatasetViewer.from_explorer(explorer)
[9]:
# condition
brepcount_is_large = lambda ds: ds['num_nodes'] > 200
filelist = explorer.get_file_list(group="graph", where=brepcount_is_large)
print(len(filelist))
98
[10]:
fig = dataset_viewer.show_preview_as_image(filelist[80:100])

../../../_images/tutorials_hoops_ai_tutorials_notebooks_4a_5k_dataserving_12_0.png
[11]:
import time
start_time = time.time()
face_dist = explorer.create_distribution(key="part_label", bins=None, group="Labels")
print(f"Label distribution created in {(time.time() - start_time):.2f} seconds\n")
helper_tutorials.print_distribution_info(face_dist, title="Labels")

Label distribution created in 0.23 seconds

../../../_images/tutorials_hoops_ai_tutorials_notebooks_4a_5k_dataserving_13_1.png
[12]:
# condition
label_is_pipefittings = lambda ds: ds['part_label'] == 15
filelist = explorer.get_file_list(group="Labels", where=label_is_pipefittings)
print(len(filelist))
36
[13]:
fig = dataset_viewer.show_preview_as_image(filelist[0:36])
../../../_images/tutorials_hoops_ai_tutorials_notebooks_4a_5k_dataserving_15_0.png
[14]:
# Get and print metadata information
file_id = 33

df_info = explorer.get_parquet_info_by_code(file_id)
print(type(df_info), df_info)
<class 'pandas.core.frame.DataFrame'>                                name  id  \
0  01feb70b6089fc23b2aa5298f50fdf7c  33

                                         description  \
0  C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor...

                                    stream_cache_png  \
0  C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor...

                                     stream_cache_3d subset table_name
0  C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutor...    N/A  file_info
[ ]:

[15]:
print(explorer.get_descriptions("part_label_description"))
[DatasetExplorer] No records found for part_label_description.
Empty DataFrame
Columns: []
Index: []
[16]:
start_time = time.time()
dist = explorer.create_distribution(key="num_nodes", bins=12, group="graph")
print(f"BRep face-count distribution created in {(time.time() - start_time):.2f} seconds\n")
helper_tutorials.print_distribution_info(dist, title="BRep face-count distribution")
INFO:full garbage collection released 87.16 MiB from 44564 reference cycles (threshold: 9.54 MiB)
BRep face-count distribution created in 0.26 seconds

../../../_images/tutorials_hoops_ai_tutorials_notebooks_4a_5k_dataserving_19_2.png

Gather files that satisfy a given condition

[ ]:

[17]:
start_time = time.time()

# condition
label_is_pipefittings = lambda ds: ds['part_label'] == 15

filelist = explorer.get_file_list(group="Labels", where=label_is_pipefittings)
print(f"Filtering completed in {(time.time() - start_time):.2f} seconds")
print(f"Found {len(filelist)} files with file_labels == 15 (Pipe Fittings)\n")
print(filelist)
Filtering completed in 0.06 seconds
Found 36 files with file_labels == 15 (Pipe Fittings)

[ 916 1115 1160 1203 1536 1633 1717 1728 1902 1985 2278 2283 2546 2572
 2673 2931 2932 2937 2981 2986 3098 3381 3436 3445 3515 3609 3673 3714
 3772 3788 4111 4269 4335 4352 4511 4512]

Query data for single file

[18]:
def demo_query_single_file(explorer, file_id):
    """Show how to access and query dataset details for a single file."""
    print("=== Single File Dataset Access ===")
    import time
    # Get and print parquet info
    df_info = explorer.get_parquet_info_by_code(file_id)
    print("File info:")
    for column in df_info.columns:
        print(f"Column: {column}")
        for value in df_info[column]:
            print(f"  {value}")
    print()

    # Access various dataset groups
    groups = ["faces", "Labels", "edges", "graph"]
    datasets = {grp: explorer.file_dataset(file_id_code=file_id, group=grp) for grp in groups}

    print(f"Datasets for file ID '{file_id}':")
    for grp, ds in datasets.items():
        for name, da in ds.data_vars.items():
            print(f"  [{grp}] VARIABLE: {name}, Shape: {da.shape}, Dims: {da.dims}, Size: {da.size}")
    print()

    # Query UV-grid data for a specific face
    start_time = time.time()
    uv_grid_data = datasets["faces"]["face_discretization"].isel(face=2)
    print("face grid data for face index 2:")
    np_uvgrid = uv_grid_data.data.compute()
    print(f"Query took {(time.time() - start_time):.2f} seconds\n")
    #print(np_uvgrid)
[19]:
demo_query_single_file(explorer,file_id=4500)
=== Single File Dataset Access ===
File info:
Column: name
  ff1943a9c00c2442c88d595a8e5746cd
Column: id
  4500
Column: description
  C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutorials\packages\cadfiles\fabwave\CAD16-24\Shaft_Collar\STEP\793834f0-d6af-4a7a-9375-13df98379e63.stp
Column: stream_cache_png
  C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutorials\notebooks\out\flows\ETL_Fabwave_training_b2\stream_cache\ff1943a9c00c2442c88d595a8e5746cd.png
Column: stream_cache_3d
  C:\Users\LuisSalazar\MAIN\repos\HOOPS-AI-tutorials\notebooks\out\flows\ETL_Fabwave_training_b2\stream_cache\ff1943a9c00c2442c88d595a8e5746cd.scs
Column: subset
  N/A
Column: table_name
  file_info

Datasets for file ID '4500':
  [faces] VARIABLE: face_areas, Shape: (17,), Dims: ('face',), Size: 17
  [faces] VARIABLE: face_discretization, Shape: (17, 100, 7), Dims: ('face', 'sample', 'component'), Size: 11900
  [faces] VARIABLE: face_indices, Shape: (17,), Dims: ('face',), Size: 17
  [faces] VARIABLE: face_loops, Shape: (17,), Dims: ('face',), Size: 17
  [faces] VARIABLE: face_types, Shape: (17,), Dims: ('face',), Size: 17
  [faces] VARIABLE: file_id_code_faces, Shape: (17,), Dims: ('face',), Size: 17
  [Labels] VARIABLE: file_id_code_Labels, Shape: (1,), Dims: ('Labels_part_label_dim_0',), Size: 1
  [Labels] VARIABLE: part_label, Shape: (1,), Dims: ('Labels_part_label_dim_0',), Size: 1
  [edges] VARIABLE: edge_convexities, Shape: (38,), Dims: ('edge',), Size: 38
  [edges] VARIABLE: edge_dihedral_angles, Shape: (38,), Dims: ('edge',), Size: 38
  [edges] VARIABLE: edge_indices, Shape: (38,), Dims: ('edge',), Size: 38
  [edges] VARIABLE: edge_lengths, Shape: (38,), Dims: ('edge',), Size: 38
  [edges] VARIABLE: edge_types, Shape: (38,), Dims: ('edge',), Size: 38
  [edges] VARIABLE: edge_u_grids, Shape: (38, 10, 6), Dims: ('edge', 'dim_x', 'component'), Size: 2280
  [edges] VARIABLE: file_id_code_edges, Shape: (38,), Dims: ('edge',), Size: 38
  [graph] VARIABLE: edges_destination, Shape: (38,), Dims: ('edge',), Size: 38
  [graph] VARIABLE: edges_source, Shape: (38,), Dims: ('edge',), Size: 38
  [graph] VARIABLE: file_id_code_graph, Shape: (38,), Dims: ('edge',), Size: 38
  [graph] VARIABLE: num_nodes, Shape: (38,), Dims: ('edge',), Size: 38

face grid data for face index 2:
Query took 0.03 seconds

[ ]: