Source code for ClearMap.Alignment.utils
import os
import json
import numpy as np
import pandas as pd
[docs]
def get_all_structs(dfs):
    """
    Get all the structures that are in any of the dataframes
    Parameters
    ----------
    dfs list(pd.DataFrame)
    Returns
    -------
    """
    structs = pd.Series()
    for df in dfs:
        structs = pd.concat((structs, df['id']))
    return np.sort(structs.unique()) 
########################### Label table creation
### Utility functions for label table creation
[docs]
def get_flattened_structure(structure):
    """
    flattens the initial nested dict into a list of dicts (one dict per structure), retaining all the information
    """
    children_list = []
    children = structure.get('children')  # can be empty list
    for child in children:
        children_list.append(child)
        children_list.extend(get_flattened_structure(child))  # recursion
    return children_list 
[docs]
def get_direct_children_structures_ids(children):
    """
    children: list of structures
    returns a list of the ids of direct children only
    """
    return [child.get("id") for child in children] 
[docs]
def get_all_children_structures_ids(children):
    """
    children: list of structures
    returns a list of the ids of all children, (direct children, their children and so on)
    """
    list_all_children = children.copy()
    for child in children:
        list_all_children.extend(get_flattened_structure(child))
    return [child.get("id") for child in list_all_children] 
[docs]
def get_structure_path(structure_id, df):
    """
    Parameters
    ----------
    structure_id: int
        id of the structure of interest
    Returns
    -------
    structure_path: list of int
        path from root structure to structure of interest
        example: [997, 8, 343, 313, 348, 165, 100]
    """
    df = df.set_index('id')
    structure_path = [int(structure_id)]
    while structure_id:
        structure_id = df.loc[structure_id, "parent_structure_id"]
        structure_id = 0 if np.isnan(structure_id) else structure_id
        structure_path = [int(structure_id)] + structure_path if structure_id else structure_path
    return structure_path 
### Main function for label table creation
[docs]
def create_label_table(fpath, save=False, from_cached=False):
    """
    Parameters
    ----------
    fpath: str
        Path to a JSON file similar to the one downloaded from 'http://api.brain-map.org/api/v2/structure_graph_download/1.json'
    Returns
    -------
    df: pd.DataFrame
        dataframe holding informations on the labels ()
    """
    assert fpath.endswith('.json')
    if from_cached:
        if os.path.isfile(fpath + 'l'):
            return pd.read_json(fpath + "l", orient="records", lines=True)
    with open(fpath, 'r') as file_in:
        data = json.load(file_in)['msg']
    assert len(data) == 1
    ## flatten the label file
    data.extend(get_flattened_structure(data[0]))
    df = pd.DataFrame(data)
    ## add 3 columns
    df["direct_children_structures_ids"] = df.children.map(get_direct_children_structures_ids)
    df['all_children_structures_ids'] = df.children.map(get_all_children_structures_ids)
    df['structure_path'] = df['id'].map(lambda x: get_structure_path(x, df))
    ## filter columns of interest
    cols_kept = [
        'id',
        'acronym',
        'name',
        'color_hex_triplet',
        'st_level',
        'parent_structure_id',
        'direct_children_structures_ids',
        'all_children_structures_ids',
        'structure_path',
    ]
    df = df[cols_kept].copy()
    ## save to a JSONL file
    if save:
        df.to_json(fpath + 'l', orient="records", lines=True)
    return df