Source code for bmtk.utils.cell_types_db

from pathlib import Path
import os
import io

import xml.etree.ElementTree as ET 
import requests
import zipfile


[docs] def download_model(specimen_id, model_type='Biophysical - all active', base_dir='models', overwrite=False): """Uses the Allen REST API to find and download the model files for a given cell. All relevant files (parameters json and morphology swc) will be saved in a separate folder, the path to which will be returned. Notes: Using the REST API because at the moment I don't think the AllenSDK is capable of downloading parameters_fit.json files, see https://community.brain-map.org/t/cell-types-database-api/3016 for more info on how to use the API. """ # Set a request to get fetch model data available for a given speciment_id. It will return a xml string that needs to be parsed so # that we can find the correct model_id. api_url = f"http://api.brain-map.org/api/v2/data/query.xml?criteria=model::NeuronalModel,rma::critera,[specimen_id$eq{specimen_id}]" response = requests.get(api_url) xml_root = ET.fromstring(response.content) model_id = None for (model_name, model_id) in zip(xml_root.iter('name'), xml_root.iter('id')): if 'Biophysical - all active' in model_name.text: model_id = int(model_id.text) break if model_id is None: raise ValueError(f'Could not find a "{model_type}" model for cell {specimen_id}') # Now that we have the model_id for the given cell we can download and unzip the files into the correct directory. To prevent downloading # the zip everytime we'll check to see if the directory already exists. model_dir = Path(f'{base_dir}/neuronal_model_{model_id}') if model_dir.exists() and not overwrite: print(f'> {model_dir} already exits, skipping donwloadng data') return model_dir zip_uri = f'http://api.brain-map.org/neuronal_model/download/{model_id}' zip_response = requests.get(zip_uri) zip_file = zipfile.ZipFile(io.BytesIO(zip_response.content)) zip_file.extractall(model_dir) return model_dir
[docs] def download_ephys_data(specimen_id, download_dir='ephys_inputs'): """Download nwb file containing sweeps.""" api_url = f'http://api.brain-map.org/api/v2/data/query.xml?criteria=model::Specimen,rma::criteria,[id$eq{specimen_id}],rma::include,ephys_result(well_known_files(well_known_file_type[name$eqNWBDownload]))' response = requests.get(api_url) # print(response.content) download_uri = None xml_root = ET.fromstring(response.content) for dl_link in xml_root.iter('download-link'): download_uri = dl_link.text break ephys_id = None for erid in xml_root.iter('ephys-result-id'): ephys_id = erid.text break nwb_path = Path(f'{download_dir}/{ephys_id}_ephys.nwb') if nwb_path.exists(): print(f'> {nwb_path} already exits, skipping donwload.') return if not Path(download_dir).exists(): os.makedirs(download_dir) url_req = f'https://celltypes.brain-map.org/{download_uri}' nwb_req = requests.get(url_req, stream=True) with open(nwb_path, 'wb') as fh: for chunk in nwb_req.iter_content(): fh.write(chunk)
[docs] def test_fn(): print("HERE")