russelljjarvis / SpinnakerHippocampus

Assignments for an academic course
0 stars 3 forks source link

Right syntax to query neuroelectro API to get pooled summary observations on neuron number 115 #3

Open russelljjarvis opened 6 years ago

russelljjarvis commented 6 years ago

@rgerkin Right syntax to query neuroelectro API to get pooled summary observations on neuron number 115

In this notebook I use I want to interrogate subject high CV2 ISIs to neuronunit testing of CV2 and local variation.

I want to use neuroelectro pooled summary observations of CV2 and firing rates where they exist. https://neuroelectro.org/neuron/115/ https://neuroelectro.org/data_table/3099

The following code snippet outlines my attempt to get neuroelectro data for neuron 115: https://github.com/russelljjarvis/DAnalysisCNeuro/blob/master/Spike_Analysis.ipynb#L110-L160

from neuronunit import tests as nu_tests, neuroelectro
from neuronunit.tests import passive, waveform, fi
cholinergic = {'neuron':'115'}
import neuronunit
from neuronunit.tests import dynamics# import ISITest, LocalVariationTest
from neuronunit.tests.dynamics import ISITest, LocalVariationTest
cholinergic = {'neuron':115}
test_class_params = [(fi.RheobaseTest,None),
                 (dynamics.ISITest,None),
                 (dynamics.LocalVariationTest,None),]#,

neuroelectro.NeuroElectroData.set_neuron('115')

{'neuron': 115}

neuroelectro.NeuroElectroData.get_values(neuroelectro.NeuroElectroData)

neuroelectro.NeuroElectroData.get_values(neuroelectro.NeuroElectroData)

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-19-bd5ef8e810c9> in <module>()
----> 1 neuroelectro.NeuroElectroData.get_values(neuroelectro.NeuroElectroData)

~/neuronunit/neuronunit/neuroelectro.py in get_values(self, params, quiet)
    175         We will use 'params' in the future to specify metadata (e.g. temperature)
    176         that neuroelectro.org will provide."""
--> 177         db = shelve.open('neuroelectro-cache') if self.cached else {}
    178         contents = (self.__class__,self.neuron,self.ephysprop,params)
    179         if DUMP:

AttributeError: type object 'NeuroElectroData' has no attribute 'cached'

 neuroelectro.NeuroElectroData.get_json(neuroelectro.NeuroElectroData)
```python 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-20-8403bbfcc389> in <module>()
----> 1 neuroelectro.NeuroElectroData.get_json(neuroelectro.NeuroElectroData)

~/neuronunit/neuronunit/neuroelectro.py in get_json(self, params, quiet)
    144         set neuron and ephys property.  Use 'params' to constrain the
    145         data returned."""
--> 146         url = self.make_url(params=params)
    147         if not quiet:
    148             print(url)

TypeError: make_url() missing 1 required positional argument: 'self'
russelljjarvis commented 6 years ago

This approach works on the neuron, but only for preestablished neuronunit tests.

from neuronunit import tests as nu_tests, neuroelectro
from neuronunit.tests import passive, waveform, fi
cholinergic = {'neuron':'115'}
import neuronunit
from neuronunit.tests import dynamics# import ISITest, LocalVariationTest
from neuronunit.tests.dynamics import ISITest, LocalVariationTest
cholinergic = {'neuron':115}
test_class_params = [(fi.RheobaseTest,None),
                  (passive.InputResistanceTest,None),
                  (passive.TimeConstantTest,None),
                  (passive.CapacitanceTest,None),
                  (passive.RestingPotentialTest,None),
                  (waveform.InjectedCurrentAPWidthTest,None),
                  (waveform.InjectedCurrentAPAmplitudeTest,None),
                  (waveform.InjectedCurrentAPThresholdTest,None),
                  (dynamics.ISITest,None),
                  (dynamics.LocalVariationTest,None)
                 ]
chol_observations = []
for cls,params in test_class_params:
    neuron_ = neuroelectro.NeuroElectroData.set_neuron('115')
    print(dir(neuroelectro.NeuroElectroData))
    #['n']=115
    print(dir(cls.neuroelectro_summary_observation))
    print(dir(cls))
    print(cls.neuroelectro_pooled_observation(neuron_))

    chol_observations.append(cls.neuroelectro_summary_observation(neuron_))
    #print(chol_observations)
russelljjarvis commented 6 years ago

Getting more to the root of NE API problem, I have found that neuronunit.tests.base VmTest has the neuroelectro methods:

    @classmethod
    def neuroelectro_pooled_observation(cls, neuron, cached=False, quiet=True):
        reference_data = neuroelectro.NeuroElectroPooledSummary(
            neuron = neuron, # Neuron type lookup using the NeuroLex ID.
            ephysprop = {'name': cls.ephysprop_name}, # Ephys property name in
                                                      # NeuroElectro ontology.
            cached = cached
            )
        reference_data.get_values(quiet=quiet) # Get and verify summary data
                                    # from neuroelectro.org.
        observation = {'mean': reference_data.mean*cls.units,
                       'std': reference_data.std*cls.units,
                       'n': reference_data.n}
        return observation

It looks like ephys_prop can be any name from the ontology. https://neuroelectro.org/ephys_prop/ontology/

However CV is not included in the ontology, even though it is in this data table:

https://neuroelectro.org/data_table/3099/

Firing rate (Hz)Concept: firing frequency | Coefficient of variation (CV)

I am unsure if thats a problem. A work around might involve just hardcoding in:

$ 0.19  ± 0.10 $
rgerkin commented 6 years ago

For spontaneous firing rate (Ephys property 18 in the neuroelectro ontology) you can do https://neuroelectro.org/api/1/nes/?n=115&e=18

rgerkin commented 6 years ago
x = NeuroElectroSummary() 
x.set_neuron(id=115)
x.set_ephysprop(id=18)  
x.get_values() 
rgerkin commented 6 years ago

or x = NeuroElectroSummary(neuron=115,ephysprop=18).get_values()

rgerkin commented 6 years ago

FYI, this is the API documentation for composing URLs.

russelljjarvis commented 6 years ago

Notedd.