# Allen Institute Software License - This software license is the 2-clause BSD
# license plus a third clause that prohibits redistribution for commercial
# purposes without further permission.
#
# Copyright 2015-2016. Allen Institute. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# 3. Redistributions for commercial purposes are not permitted without the
# Allen Institute's written permission.
# For purposes of this license, commercial purposes is the incorporation of the
# Allen Institute's software into anything for which you will charge fees or
# other compensation. Contact terms@alleninstitute.org for commercial licensing
# opportunities.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
import simplejson as json
import logging
from ...deprecated import deprecated
from .rma_template import RmaTemplate
[docs]class GlifApi(RmaTemplate):
_log = logging.getLogger('allensdk.api.queries.glif_api')
NWB_FILE_TYPE = None
GLIF_TYPES = [ 395310498, 395310469, 395310475, 395310479, 471355161 ]
rma_templates = \
{"glif_queries": [
{'name': 'neuronal_model_templates',
'description': 'see name',
'model': 'NeuronalModelTemplate',
'num_rows': 'all',
'count': False,
},
{'name': 'neuronal_models',
'description': 'see name',
'model': 'Specimen',
'include': 'neuronal_models(well_known_files,neuronal_model_template[id$in' + ','.join(map(str,GLIF_TYPES)) + '],neuronal_model_runs(well_known_files))',
'criteria':'{% if ephys_experiment_ids is defined %}[id$in{{ ephys_experiment_ids }}]{%endif%}',
'num_rows': 'all',
'criteria_params':['ephys_experiment_ids'],
'count': False,
},
{'name': 'neuron_config',
'description': 'see name',
'model': 'NeuronalModel',
'include': 'well_known_files(well_known_file_type)',
'criteria':'[id$in{{ neuronal_model_ids }}]',
'num_rows': 'all',
'criteria_params':['neuronal_model_ids'],
'count': False,
}
]
}
def __init__(self, base_uri=None):
super(GlifApi, self).__init__(base_uri, query_manifest=GlifApi.rma_templates)
[docs] def get_neuronal_model_templates(self):
return self.template_query('glif_queries',
'neuronal_model_templates')
[docs] def get_neuronal_models(self, ephys_experiment_ids=None):
return self.template_query('glif_queries',
'neuronal_models', ephys_experiment_ids=ephys_experiment_ids)
[docs] def get_neuronal_models_by_id(self, neuronal_model_ids=None):
return self.template_query('glif_queries',
'neuron_config', neuronal_model_ids=neuronal_model_ids)
[docs] def get_neuron_configs(self, neuronal_model_ids=None):
data = self.template_query('glif_queries',
'neuron_config', neuronal_model_ids=neuronal_model_ids)
return_dict = {}
for curr_config in data:
# print curr_config
neuron_config_url = curr_config['well_known_files'][0]['download_link']
return_dict[curr_config['id']] = self.retrieve_parsed_json_over_http(self.api_url +
neuron_config_url)
return return_dict
[docs] @deprecated()
def list_neuronal_models(self):
''' DEPRECATED Query the API for a list of all GLIF neuronal models.
Returns
-------
list
Meta data for all GLIF neuronal models.
'''
include = "specimen(ephys_result[failed$eqfalse]),neuronal_model_template[name$il'*LIF*']"
return self.model_query('NeuronalModel',
include=include,
num_rows='all')
[docs] @deprecated()
def get_neuronal_model(self, neuronal_model_id):
'''DEPRECATED Query the current RMA endpoint with a neuronal_model id
to get the corresponding well known files and meta data.
Returns
-------
dict
A dictionary containing
'''
include = ('neuronal_model_template(well_known_files(well_known_file_type)),' +
'specimen(ephys_sweeps,ephys_result(well_known_files(well_known_file_type))),' +
'well_known_files(well_known_file_type)')
criteria = "[id$eq%d]" % neuronal_model_id
self.neuronal_model = self.model_query('NeuronalModel',
criteria=criteria,
include=include,
num_rows='all')[0]
self.ephys_sweeps = None
self.neuron_config_url = None
self.stimulus_url = None
# sweeps come from the specimen
try:
specimen = self.neuronal_model['specimen']
self.ephys_sweeps = specimen['ephys_sweeps']
except Exception as e:
logging.info(e.args)
self.ephys_sweeps = None
if self.ephys_sweeps is None:
logging.warning(
"Could not find ephys_sweeps for this model (%d)" % self.neuronal_model['id'])
# neuron config file comes from the neuronal model's well known files
try:
for wkf in self.neuronal_model['well_known_files']:
if wkf['path'].endswith('neuron_config.json'):
self.neuron_config_url = wkf['download_link']
break
except Exception as e:
self.neuron_config_url = None
if self.neuron_config_url is None:
logging.warning(
"Could not find neuron config well_known_file for this model (%d)" % self.neuronal_model['id'])
# NWB file comes from the ephys_result's well known files
try:
ephys_result = specimen['ephys_result']
for wkf in ephys_result['well_known_files']:
if wkf['well_known_file_type']['name'] == 'NWBDownload':
self.stimulus_url = wkf['download_link']
break
except Exception as e:
self.stimulus_url = None
if self.stimulus_url is None:
logging.warning(
"Could not find stimulus well_known_file for this model (%d)" % self.neuronal_model['id'])
self.metadata = {
'neuron_config_url': self.neuron_config_url,
'stimulus_url': self.stimulus_url,
'ephys_sweeps': self.ephys_sweeps,
'neuronal_model': self.neuronal_model
}
return self.metadata
[docs] @deprecated()
def get_ephys_sweeps(self):
''' DEPRECATED Retrieve ephys sweep information out of downloaded metadata for a neuronal model
Returns
-------
list
A list of sweeps metadata dictionaries
'''
return self.ephys_sweeps
[docs] @deprecated()
def get_neuron_config(self, output_file_name=None):
''' DEPRECATED Retrieve a model configuration file from the API, optionally save it to disk, and
return the contents of that file as a dictionary.
Parameters
----------
output_file_name: string
File name to store the neuron configuration (optional).
'''
if self.neuron_config_url is None:
raise Exception("URL for neuron config file is empty.")
logging.info(self.api_url + self.neuron_config_url)
neuron_config = self.retrieve_parsed_json_over_http(
self.api_url + self.neuron_config_url)
if output_file_name:
with open(output_file_name, 'wb') as f:
f.write(json.dumps(neuron_config, indent=2))
return neuron_config
[docs] @deprecated()
def cache_stimulus_file(self, output_file_name):
''' DEPRECATED Download the NWB file for the current neuronal model and save it to a file.
Parameters
----------
output_file_name: string
File name to store the NWB file.
'''
if self.stimulus_url is None:
raise Exception("URL for stimulus file is empty.")
self.retrieve_file_over_http(
self.api_url + self.metadata['stimulus_url'], output_file_name)