예제 #1
0
def spikeforest_sort(
        recording_dirname, # The recording extractor
        sorter,
        sorting_params,
        _force_run=False,
        _force_save=False
    ):
    
    recording_signature=kb.computeDirHash(recording_dirname)
    signature_obj=dict(
        sorter_name=sorter.name,
        sorter_version=sorter.version,
        recording=recording_signature,
        sorting_params=sorting_params
    )
    if not _force_run:
        print('Looking up in cache...')
        firings=kb.realizeFile(key=signature_obj)
        if firings:
            print('Found')
            if _force_save:
                print('Saving')
                kb.saveFile(fname=firings,key=signature_obj)
            return si.MdaSortingExtractor(firings_file=firings)
    
    recording=si.MdaRecordingExtractor(recording_dirname)
    sorting=sorter(recording=recording,**sorting_params)
    
    si.MdaSortingExtractor.writeSorting(sorting=sorting,save_path='tmp_firings.mda')
    kb.saveFile(fname='tmp_firings.mda',key=signature_obj)

    return sorting
예제 #2
0
def compare_with_truth(result):
    ret={}
    units_true=result.get('units_true',[])
    out=GenSortingComparisonTable.execute(firings=result['firings'],firings_true=result['firings_true'],units_true=units_true,json_out={'ext':'.json'},html_out={'ext':'.html'}).outputs
    ret['json']=kb.saveFile(out['json_out'],basename='table.json')
    ret['html']=kb.saveFile(out['html_out'],basename='table.html')
    return ret
def compute_recording_info(recording):
    out = ComputeRecordingInfo.execute(recording_dir=recording['directory'],
                                       channels=recording.get('channels', []),
                                       json_out={
                                           'ext': '.json'
                                       }).outputs['json_out']
    kb.saveFile(out)
    return read_json_file(kb.realizeFile(out))
def create_timeseries_plot(recording):
    out = CreateTimeseriesPlot.execute(recording_dir=recording['directory'],
                                       channels=recording.get('channels', []),
                                       jpg_out={
                                           'ext': '.jpg'
                                       }).outputs['jpg_out']
    kb.saveFile(out)
    return 'sha1://' + kb.computeFileSha1(out) + '/timeseries.jpg'
def create_waveforms_plot(recording, firings):
    out = CreateWaveformsPlot.execute(recording_dir=recording['directory'],
                                      channels=recording.get('channels', []),
                                      units=recording.get('units_true', []),
                                      firings=firings,
                                      jpg_out={
                                          'ext': '.jpg'
                                      }).outputs['jpg_out']
    kb.saveFile(out)
    return 'sha1://' + kb.computeFileSha1(out) + '/waveforms.jpg'
예제 #6
0
def sort_recording(sorter, recording):
    dsdir = recording['directory']
    sorting_params = sorter['params']
    processor_name = sorter['processor_name']
    if processor_name in Processors:
        SS = Processors[processor_name]
    else:
        raise Exception('No such sorter: ' + processor_name)

    outputs = SS.execute(recording_dir=dsdir,
                         channels=recording.get('channels', []),
                         firings_out=dict(ext='.mda'),
                         **sorting_params).outputs
    firings_out = kb.saveFile(outputs['firings_out'])
    firings_true_path = recording['directory'] + '/firings_true.mda'
    if not kb.findFile(firings_true_path):
        firings_true_path = None
    result = dict(recording_name=recording['name'],
                  study_name=recording['study'],
                  sorter_name=sorter['name'],
                  recording_dir=dsdir,
                  channels=recording.get('channels', []),
                  units_true=recording.get('units_true', []),
                  firings_true=firings_true_path,
                  sorting_params=sorting_params,
                  sorting_processor_name=SS.NAME,
                  sorting_processor_version=SS.VERSION,
                  firings=firings_out)
    result['summary'] = summarize_sorting(result)
    if result.get('firings_true', None):
        result['comparison_with_truth'] = compare_with_truth(result)

    return result
예제 #7
0
def sortDataset(*, sorter, dataset, _force_run=False):
    dsdir = dataset['directory']
    sorting_params = sorter['params']
    sorting_processor = sorter['processor']
    outputs = sorting_processor.execute(dataset_dir=dsdir,
                                        firings_out=dict(ext='.mda'),
                                        **sorting_params,
                                        _force_run=_force_run).outputs
    result = dict(dataset_name=dataset['name'],
                  dataset_dir=dsdir,
                  firings_true=dsdir + '/firings_true.mda',
                  sorting_params=sorting_params,
                  sorting_processor_name=sorting_processor.NAME,
                  sorting_processor_version=sorting_processor.VERSION,
                  firings=outputs['firings_out'])
    kb.saveFile(outputs['firings_out'])
    return result
def summarize_recording(recording):
    ret = deepcopy(recording)
    ret['computed_info'] = compute_recording_info(recording)
    firings_true_path = recording['directory'] + '/firings_true.mda'
    ret['plots'] = dict(timeseries=create_timeseries_plot(recording))
    channels = recording.get('channels', None)
    units = recording.get('units_true', None)
    if kb.findFile(firings_true_path):
        ret['firings_true'] = firings_true_path
        ret['plots']['waveforms_true'] = create_waveforms_plot(
            recording, ret['firings_true'])
        true_units_info_fname = compute_units_info(
            recording_dir=recording['directory'],
            firings=firings_true_path,
            return_format='filename',
            channel_ids=channels,
            unit_ids=units)
        kb.saveFile(true_units_info_fname)
        ret['true_units_info'] = 'sha1://' + kb.computeFileSha1(
            true_units_info_fname) + '/true_units_info.json'
    return ret
예제 #9
0
def sort_recording(sorter, recording):
    dsdir = recording['directory']
    sorting_params = sorter['params']
    processor_name = sorter['processor_name']
    if processor_name in Processors:
        SS = Processors[processor_name][0]
        SS_container_env_variable_name = Processors[processor_name][1]
    else:
        raise Exception('No such sorter: ' + processor_name)

    if SS_container_env_variable_name:
        if not SS_container_env_variable_name in os.environ:
            raise Exception('Environment variable must be set: ' +
                            SS_container_env_variable_name)
        container = os.environ[SS_container_env_variable_name]
    else:
        container = None

    if container:
        if not os.path.exists(container):
            raise Exception('Container file does not exist: ' + container)

    print('Sorting recording {} using {}'.format(dsdir, processor_name))
    outputs = SS.execute(_container=container,
                         recording_dir=dsdir,
                         channels=recording.get('channels', []),
                         firings_out=dict(ext='.mda'),
                         **sorting_params).outputs
    print('Saving firings_out...')
    firings_out = kb.saveFile(outputs['firings_out'])
    firings_true_path = recording['directory'] + '/firings_true.mda'
    if not kb.findFile(firings_true_path):
        firings_true_path = None
    print('Assembling result...')
    result = dict(recording_name=recording['name'],
                  study_name=recording['study'],
                  sorter_name=sorter['name'],
                  recording_dir=dsdir,
                  channels=recording.get('channels', []),
                  units_true=recording.get('units_true', []),
                  firings_true=firings_true_path,
                  sorting_params=sorting_params,
                  sorting_processor_name=SS.NAME,
                  sorting_processor_version=SS.VERSION,
                  firings=firings_out)
    print('Summarizing sorting...')
    result['summary'] = summarize_sorting(result)
    if result.get('firings_true', None):
        print('Comparing with truth...')
        result['comparison_with_truth'] = compare_with_truth(result)

    return result
예제 #10
0
def summarizeSorting(result):
    ret = {'plots': {}}
    unit_waveforms = PlotUnitWaveforms.execute(
        recording_dir=result['recording_dir'],
        channels=result.get('channels', []),
        firings=result['firings'],
        plot_out={
            'ext': '.jpg'
        }).outputs['plot_out']
    unit_waveforms = kb.saveFile(unit_waveforms, basename='unit_waveforms.jpg')
    ret['plots']['unit_waveforms'] = unit_waveforms

    autocorrelograms = PlotAutoCorrelograms.execute(
        recording_dir=result['recording_dir'],
        channels=result.get('channels', []),
        firings=result['firings'],
        plot_out={
            'ext': '.jpg'
        }).outputs['plot_out']
    autocorrelograms = kb.saveFile(autocorrelograms,
                                   basename='autocorrelograms.jpg')
    ret['plots']['autocorrelograms'] = autocorrelograms

    return ret
예제 #11
0
def create_waveforms_plot(dataset,firings):
  out=CreateWaveformsPlot.execute(recording_dir=dataset['directory'],firings=firings,jpg_out={'ext':'.jpg'}).outputs['jpg_out']
  kb.saveFile(out)
  return 'sha1://'+kb.computeFileSha1(out)+'/waveforms.jpg'
예제 #12
0
def create_timeseries_plot(dataset):
  out=CreateTimeseriesPlot.execute(recording_dir=dataset['directory'],jpg_out={'ext':'.jpg'}).outputs['jpg_out']
  kb.saveFile(out)
  return 'sha1://'+kb.computeFileSha1(out)+'/timeseries.jpg'
예제 #13
0
def compute_dataset_info(dataset):
  out=ComputeDatasetInfo.execute(recording_dir=dataset['directory'],json_out={'ext':'.json'}).outputs['json_out']
  kb.saveFile(out)
  return read_json_file(kb.realizeFile(out))