def calculate_cell_means(project):
    cells = {}
    epochs = []
    for expt in iterable(project.getExperiments()):
        for epoch in iterable(expt.getEpochs()): # ctx.getObjectsWithTag('demo')
            epochs += [epoch]
            cell = epoch.getInputSources().get('cell')
            if len(list(iterable(epoch.getMeasurements()))) > 0:
                m = epoch.getMeasurement('Membrane current')
                data = as_data_frame(m)
                peak = max(data['current']).item()
                k = "{0} ({1})  {2}".format(cell.getLabel(), cell.getIdentifier(), cell.getURI().toString())
                peaks = cells.get(k, {})
                pk = "{0} mV".format(epoch.getProtocolParameters().get('step_amplitude_mV'))
                cell_peaks = peaks.get(pk, [])
                peaks[pk] = cell_peaks + [peak]
                cells[k] = peaks
    
    for (k,v) in cells.iteritems():
        for ck, cv in v.iteritems():
            v[ck] = sp.mean(cv)
    
        cells[k] = v
        
    return (cells, epochs)
    def should_set_device_for_analog_signals(self):
        for segment, epoch in zip(self.block.segments, iterable(self.epoch_group.getEpochs())):
            measurements = dict(((m.getName(), m) for m in iterable(epoch.getMeasurements())))

            for signal in segment.analogsignals:
                m = measurements[signal.name]
                assert_equals({"amplifier.channels.{}".format(signal.annotations['channel_index'])},
                              set(iterable(m.getDevices())))
def check_measurements(segment, epoch):
    assert_equals(len(segment.analogsignals), len(list(iterable(epoch.getMeasurements()))))

    measurements = dict(((m.getName(), m) for m in iterable(epoch.getMeasurements())))

    for signal in segment.analogsignals:
        m = measurements[signal.name]
        check_numeric_measurement(signal, m)
 def check_epoch_per_site(self, container):
     # One Epoch per site per day
     num_sites = len(self.group_sites())
     n_epochs = 0
     for group in iterable(container.getEpochGroups()):
         # Skip Epochs specifically for producing Sources
         n_epochs += len([e for e in list(iterable(group.getEpochs())) if e.getOutputSources().size() == 0])
     assert_equals(num_sites, n_epochs)
    def should_tag_site_with_species(self):
        species = set(self.df.Species)

        for group in iterable(self.expt.getEpochGroups()):
            for epoch in iterable(group.getEpochs()):
                src_map = to_dict(epoch.getInputSources())
                for src in src_map.values():
                    if len(list(iterable(src.getParentSources()))) == 0:
                        tags = set(iterable(src.getAllTags()))
                        assert(len(tags) > 0)
                        for tag in tags:
                            assert(tag in species)
    def should_import_epochs(self):
        expt2 = self.ctx.insertProject("project2","project2",DateTime()).insertExperiment("purpose", DateTime())
        protocol2 = self.ctx.insertProtocol("protocol", "description")
        epoch_start = DateTime()

        epoch = expt2.insertEpoch(Maps.newHashMap(),
                                  Maps.newHashMap(),
                                  epoch_start,
                                  DateTime(),
                                  protocol2,
                                  to_map({}),
                                  to_map({}))

        segment = self.block.segments[0]

        neoepoch = neo.core.epoch.Epoch(10 * pq.ms, 100 * pq.ms, "epoch1")
        segment.epochs.append(neoepoch)

        try:
            import_timeline_annotations(epoch, segment, epoch_start)

            annotations = list(iterable(epoch.getUserTimelineAnnotations(self.ctx.getAuthenticatedUser())))

            assert_equals(1, len(annotations))
            assert_equals(epoch_start.plusMillis(10).getMillis(), annotations[0].getStart().getMillis())
            assert_equals(epoch_start.plusMillis(10).plusMillis(100).getMillis(), annotations[0].getEnd().get().getMillis())
        finally:
            segment.epochs.remove(neoepoch)
    def should_import_events(self):
        expt2 = self.ctx.insertProject("project2","project2",DateTime()).insertExperiment("purpose", DateTime())
        protocol2 = self.ctx.insertProtocol("protocol", "description")
        epoch_start = DateTime()
        epoch = expt2.insertEpoch(Maps.newHashMap(),
                                  Maps.newHashMap(),
                                  epoch_start,
                                  DateTime(),
                                  protocol2,
                                  to_map(dict()),
                                  to_map(dict()))

        segment = self.block.segments[0]
        event_ms = 10
        event1 = Event(event_ms * pq.ms, "event1", name = "event1")

        segment.events.append(event1)

        try:
            import_timeline_annotations(epoch, segment, epoch_start)

            annotations = list(iterable(epoch.getUserTimelineAnnotations(self.ctx.getAuthenticatedUser())))

            assert(epoch_start.plusMillis(event_ms).equals(annotations[0].getStart()))
            assert_equals(1, len(annotations))
        finally:
            segment.events.remove(event1)
    def should_call_via_main(self):
        expt2 = self.ctx.insertProject("project2","project2",DateTime()).insertExperiment("purpose", DateTime())
        protocol2 = self.ctx.insertProtocol("protocol", "description")

        args = ['executable-name',
                '--source={}'.format(self.src.getURI().toString()),
                '--timezone=America/New_York',
                '--container={}'.format(expt2.getURI().toString()),
                '--protocol={}'.format(protocol2.getURI().toString()),
                'fixtures/example1.abf',
                ]

        main(argv=args, dsc=self.get_dsc())

        epoch_group = list(iterable(expt2.getEpochGroups()))[0]
        assert_equals(len(self.block.segments), len(set(iterable(epoch_group.getEpochs()))), "should import one epoch per segment")
def import_spiketrains(epoch, protocol, segment):
    for (i, spike_train) in enumerate(segment.spiketrains):
        params = {'t_start_ms': spike_train.t_start.rescale(pq.ms).item(),
                  't_stop_ms': spike_train.t_stop.rescale(pq.ms).item(),
                  'sampling_rate_hz': spike_train.sampling_rate.rescale(pq.Hz).item(),
                  'description': spike_train.description,
                  'file_origin': spike_train.file_origin}

        if spike_train.name:
            name = spike_train.name
        else:
            name = "spike train {}".format(i + 1)

        inputs = Maps.newHashMap()
        for m in iterable(epoch.getMeasurements()):
            inputs.put(m.getName(), m)

        ar = epoch.addAnalysisRecord(name,
                                     inputs,
                                     protocol,
                                     to_map(params))

        #
        spike_train.labels = ['spike time' for i in spike_train.shape]
        spike_train.sampling_rates = [spike_train.sampling_rate for i in spike_train.shape]

        spike_train.waveforms.labels = ['channel index', 'time', 'spike']
        spike_train.waveforms.sampling_rates = [0, spike_train.sampling_rate, 0] * pq.Hz

        insert_numeric_analysis_artifact(ar,
                                         name,
                                         {'spike times': spike_train,
                                          'spike waveforms': spike_train.waveforms})
 def collect_epochs_by_site(self, epoch_groups, ts):
     epochs = {}
     for e in iterable(epoch_groups[ts].getEpochs()):
         sources = to_dict(e.getInputSources())
         for s in sources.values():
             if s.getLabel() in self.df.Site.base:
                 epochs[s.getLabel()] = e
     return epochs
 def epoch_groups_by_timestamp(self):
     epoch_groups = {}
     for grp in iterable(self.expt.getEpochGroups()):
         d = grp.getStart()
         ts = pd.Timestamp(
             datetime.datetime(d.getYear(), d.getMonthOfYear(), d.getDayOfMonth(), d.getHourOfDay(),
                               d.getMinuteOfHour(),
                               d.getSecondOfMinute()))
         epoch_groups[ts] = grp
     return epoch_groups
    def should_add_sources(self):
        expected_source_names = np.unique(self.df.Site)

        sources = self.ctx.getTopLevelSources()
        src_map = {}
        for s in iterable(sources):
            src_map[s.getLabel()] = s

        for name in expected_source_names:
            assert(src_map.has_key(name))
    def should_annotate_measurements_with_observer(self):
        epoch_groups = self.epoch_groups_by_timestamp()

        for ((ts,site), group) in self.group_sites():
            epochs = self.collect_epochs_by_site(epoch_groups, ts)

            e = epochs[site]

            for i in xrange(len(group)):
                if len(list(iterable(e.getMeasurements()))) > 0:
                    m = e.getMeasurement(group['Species'][i])
                    assert_equals(group['Observer'][i], str(m.getUserProperty(self.ctx.getAuthenticatedUser(), 'Observer')))
    def should_import_spike_trains(self):
        expt2 = self.ctx.insertProject("project2","project2",DateTime()).insertExperiment("purpose", DateTime())
        protocol2 = self.ctx.insertProtocol("protocol", "description")
        epoch_start = DateTime()

        epoch = expt2.insertEpoch(Maps.newHashMap(),
                                  Maps.newHashMap(),
                                  epoch_start,
                                  DateTime(),
                                  protocol2,
                                  to_map({}),
                                  to_map({}))

        segment = self.block.segments[0]

        times = [.1, .2, .3, .4]
        waveforms = np.random.rand(2,3,4) * pq.mV

        train_name = 'spike train 1'
        spike_train = SpikeTrain(times, name=train_name, t_stop=2.0 * pq.s, units="s", waveforms=waveforms)

        segment.spiketrains.append(spike_train)
        try:
            import_spiketrains(epoch, protocol2, segment)

            records = list(iterable(epoch.getAnalysisRecords()))

            assert_equals(1, len(records))

            ar = records[0]

            assert_equals(train_name, ar.getName())

            expected_params = {'t_start_ms': spike_train.t_start.rescale(pq.ms).item(),
                  't_stop_ms': spike_train.t_stop.rescale(pq.ms).item(),
                  'sampling_rate_hz': spike_train.sampling_rate.rescale(pq.Hz).item(),
                  'description': spike_train.description,
                  'file_origin': spike_train.file_origin}

            for (k,v) in expected_params.iteritems():
                actual = ar.getProtocolParameters().get(k)
                if actual:
                    assert_equals(v, actual)

            assert_equals(len(expected_params), ar.getProtocolParameters().size())

            data_map = ar.getDataElements()
            df = as_data_frame(data_map.get(spike_train.name))

            check_signal(spike_train, df['spike times'])
            check_signal(spike_train.waveforms, df['spike waveforms'])
        finally:
            segment.spiketrains.remove(spike_train)
    def should_add_individual_measurement_sources(self):
        epoch_groups = self.epoch_groups_by_timestamp()

        for ((ts,site), group) in self.group_sites():
            epochs = self.collect_epochs_by_site(epoch_groups, ts)

            e = epochs[site]
            if 'individual' in list(iterable(e.getAllTags())):
                for i in xrange(len(group)):
                    if group['Type'][i] == MEASUREMENT_TYPE_INDIVIDUAL:
                        print(e.getInputSources(), group['Species'][i], i)
                        assert_true(e.getInputSources().containsKey(u"{} {}".format(group['Species'][i],i+1)))
    def should_use_existing_sources(self):
        expt2 = self.ctx.insertProject("project2","project2",DateTime()).insertExperiment("purpose", DateTime())
        protocol2 = self.ctx.insertProtocol("protocol", "description")

        import_csv(self.ctx,
                   container_uri=expt2.getURI().toString(),
                   protocol_uri=protocol2.getURI().toString(),
                   files=[EXAMPLE_FIELD_DATA_CSV])

        expected_source_names = np.unique(self.df.Site)

        sources = self.ctx.getTopLevelSources()

        assert_equals(len(expected_source_names), len(list(iterable(sources))))
    def should_call_via_main(self):
        expt2 = self.ctx.insertProject("project2","project2",DateTime()).insertExperiment("purpose", DateTime())
        protocol2 = self.ctx.insertProtocol("protocol", "description")

        number_of_days = np.unique(np.asarray(self.df.index)).size

        args = ['--timezone=America/New_York',
                '--container={}'.format(str(expt2.getURI().toString())),
                '--protocol={}'.format(str(protocol2.getURI().toString())),
                EXAMPLE_FIELD_DATA_CSV,
                ]

        main(args, dsc=self.dsc)

        assert_equals(number_of_days, len(list(iterable(expt2.getEpochGroups()))))
    def should_add_individual_measurements(self):
        epoch_groups = self.epoch_groups_by_timestamp()

        for ((ts,site), group) in self.group_sites():
            epochs = self.collect_epochs_by_site(epoch_groups, ts)
            e = epochs[site]

            for i in xrange(len(group)):
                if group['Type'][i] == MEASUREMENT_TYPE_INDIVIDUAL:
                    for m in iterable(e.getMeasurements()):
                        if m.getName().startswith(u"{}_{}".format(group['Species'][i],i+1)):
                            csv_path = m.getLocalDataPath().get()
                            data = pd.read_csv(csv_path)
                            expected_measurements = group.iloc[i, FIRST_MEASUREMENT_COLUMN_NUMBER:].dropna()
                            assert(np.all(data[group['Counting'][i]] == expected_measurements))
def import_analog_signal(epoch, analog_signal, equipment_setup_root):

    analog_signal.labels = [u'time']
    analog_signal.sampling_rates = [analog_signal.sampling_rate]
    if 'channel_index' in analog_signal.annotations:
        channel_index = analog_signal.annotations['channel_index']
    else:
        channel_index = 'unknown'
        log_warning("Analog signal does not have a channel index. Using '{}.channels.{}' as measurement device.".format(equipment_setup_root, channel_index))


    if analog_signal.name is not None:
        name = analog_signal.name
    else:
        name = 'analog signal'
        log_warning("Analog signal does not have a name. Using '{}' as measurement and data name.".format(name))

    device = '{}.channels.{}'.format(equipment_setup_root, channel_index)
    insert_numeric_measurement(epoch,
                               set(iterable(epoch.getInputSources().keySet())),
                               {device},
                               name,
                               {name : analog_signal})
    def should_import_event_arrays(self):
        expt2 = self.ctx.insertProject("project2","project2",DateTime()).insertExperiment("purpose", DateTime())
        protocol2 = self.ctx.insertProtocol("protocol", "description")
        epoch_start = DateTime()
        
        epoch = expt2.insertEpoch(Maps.newHashMap(),
                                  Maps.newHashMap(),
                                  epoch_start,
                                  DateTime(),
                                  protocol2,
                                  to_map({}),
                                  to_map({}))

        segment = self.block.segments[0]

        event_ms = [10, 12]
        event_array = EventArray(times=np.array(event_ms) * pq.ms, labels=['event1', 'event2'])
        segment.eventarrays.append(event_array)

        try:
            import_timeline_annotations(epoch, segment, epoch_start)

            annotations = list(iterable(epoch.getUserTimelineAnnotations(self.ctx.getAuthenticatedUser())))

            assert_equals(2, len(annotations))

            event_starts = [a.getStart() for a in annotations]
            for ms in event_ms:
                found = False
                for s in event_starts:
                    if epoch_start.plusMillis(ms).equals(s):
                        found = True

                if not found:
                    assert_true(False, "event start time doesn't match")
        finally:
            segment.eventarrays.remove(event_array)
 def should_import_one_epoch_per_block(self):
     assert_equals(len(self.block.segments), len(set(iterable(self.epoch_group.getEpochs()))), "should import one epoch per segment")
    def should_add_one_epoch_group_for_each_day(self):
        number_of_days = np.unique(np.asarray(self.df.index)).size

        assert_equals(number_of_days, len(list(iterable(self.expt.getEpochGroups()))))
 def should_store_segment_index(self):
     for segment, epoch in zip(self.block.segments, iterable(self.epoch_group.getEpochs())):
         assert_equals(segment.index,
                       (epoch.getUserProperty(epoch.getDataContext().getAuthenticatedUser(), 'index')))
 def should_import_segment_annotations(self):
     for segment, epoch in zip(self.block.segments, iterable(self.epoch_group.getEpochs())):
         # Check protocol parameters
         for k, v in segment.annotations.iteritems():
             assert_equals(v, epoch.getProtocolParameter(k))
 def should_import_analog_segments_as_measurements(self):
     for segment, epoch in zip(self.block.segments, iterable(self.epoch_group.getEpochs())):
         check_measurements(segment, epoch)
def _import_file(context, container, protocol, file_name, header_row, timezone, first_measurement_column_number, date_column):

    df = read_csv(file_name, header_row=header_row, date_column=date_column)

    # Organize sources; this should be replaced with getSourceWithName() or a query
    sites = {}
    for src in iterable(context.getTopLevelSources()):
        sites[src.getLabel()] = src

    for plot in df.Site:
        if plot not in sites:
            logging.info("Adding site " + plot)
            sites[plot] = context.insertSource(plot, plot) #TODO better name?


    # Group EpochData by (index, Site), i.e. (Date, Site)
    epoch_data = df.groupby([df.index, 'Site'])
    groups = {}
    for grp in iterable(container.getEpochGroups()):
        d = grp.getStart()
        ts = pd.Timestamp(datetime.datetime(d.getYear(), d.getMonthOfYear(), d.getDayOfMonth(), d.getHourOfDay(), d.getMinuteOfHour(), d.getSecondOfMinute()))
        groups[ts] = grp

    for (group_index, group) in epoch_data:
        logging.info("Adding data for CSV group" + str(group_index))

        # Get the Source object corresponding to this site
        plot_name = group_index[1]
        plot = sites[plot_name]
        ts = group_index[0]
        start,end = _make_day_ends(ts, timezone)

        # One EpochGroup per day
        if ts not in groups:
            group_name = "{}-{}-{}".format(start.getYear(), start.getMonthOfYear(), start.getDayOfMonth())
            print("Adding EpochGroup {}".format(group_name))
            groups[ts] = container.insertEpochGroup(group_name, start, protocol, None, None) # No protocol, params, or deviceParams

        epoch_group = groups[ts]

        # Epoch by site
        epochs = {}
        for epoch in iterable(epoch_group.getEpochs()):
            src_map = to_dict(epoch.getInputSources())
            for src in src_map.values():
                epochs[src.getLabel()] = epoch

        if not plot_name in epochs:
            print("Inserting Epoch for measurements at: {}".format(plot_name))
            epochs[plot_name] = epoch_group.insertEpoch(start, end, protocol, None, None)

        epoch = epochs[plot_name]

        for i in xrange(len(group)):
            species = group['Species'][i]
            observer = group['Observer'][i]

            print("    {}".format(species))

            # Tag the Source with the species found there
            try:
                plot.addTag(species)
            except JavaException:
                logging.error("Exception adding tag. Retrying...")
                plot.addTag(species)
                logging.info("Successfully added tag on second try")

            measurements = group.iloc[i, first_measurement_column_number:].dropna()

            if group['Type'][i] == MEASUREMENT_TYPE_SITE:

                epoch.addInputSource(plot_name, plot)

                srcNames = Sets.newHashSet()
                srcNames.add(plot_name)

                insert_measurements(epoch, group, i, measurements, plot_name, species, srcNames, start, observer)

            elif group['Type'][i] == MEASUREMENT_TYPE_INDIVIDUAL:
                individual = plot.insertSource(epoch_group,
                                               start,
                                               end,
                                               protocol,
                                               Maps.newHashMap(),
                                               Optional.absent(),
                                               u"{} {}".format(species, i+1),
                                               u"{}-{}-{}-{}".format(species, plot_name, start.toString(), i+1),)

                epoch.addInputSource(individual.getLabel(), individual)
                srcNames = Sets.newHashSet()
                srcNames.add(individual.getLabel())
                insert_measurements(epoch, group, i, measurements, plot_name, species, srcNames, start, observer)
                epoch.addTag('individual')


    return 0
Exemple #27
0
def _import_file(context, container, protocol, file_name, header_row, timezone,
                 first_measurement_column_number, date_column):

    df = read_csv(file_name, header_row=header_row, date_column=date_column)

    # Organize sources; this should be replaced with getSourceWithName() or a query
    sites = {}
    for src in iterable(context.getTopLevelSources()):
        sites[src.getLabel()] = src

    for plot in df.Site:
        if plot not in sites:
            logging.info("Adding site " + plot)
            sites[plot] = context.insertSource(plot, plot)  #TODO better name?

    # Group EpochData by (index, Site), i.e. (Date, Site)
    epoch_data = df.groupby([df.index, 'Site'])
    groups = {}
    for grp in iterable(container.getEpochGroups()):
        d = grp.getStart()
        ts = pd.Timestamp(
            datetime.datetime(d.getYear(), d.getMonthOfYear(),
                              d.getDayOfMonth(), d.getHourOfDay(),
                              d.getMinuteOfHour(), d.getSecondOfMinute()))
        groups[ts] = grp

    for (group_index, group) in epoch_data:
        logging.info("Adding data for CSV group" + str(group_index))

        # Get the Source object corresponding to this site
        plot_name = group_index[1]
        plot = sites[plot_name]
        ts = group_index[0]
        start, end = _make_day_ends(ts, timezone)

        # One EpochGroup per day
        if ts not in groups:
            group_name = "{}-{}-{}".format(start.getYear(),
                                           start.getMonthOfYear(),
                                           start.getDayOfMonth())
            print("Adding EpochGroup {}".format(group_name))
            groups[ts] = container.insertEpochGroup(
                group_name, start, protocol, None,
                None)  # No protocol, params, or deviceParams

        epoch_group = groups[ts]

        # Epoch by site
        epochs = {}
        for epoch in iterable(epoch_group.getEpochs()):
            src_map = to_dict(epoch.getInputSources())
            for src in src_map.values():
                epochs[src.getLabel()] = epoch

        if not plot_name in epochs:
            print("Inserting Epoch for measurements at: {}".format(plot_name))
            epochs[plot_name] = epoch_group.insertEpoch(
                start, end, protocol, None, None)

        epoch = epochs[plot_name]

        for i in xrange(len(group)):
            species = group['Species'][i]
            observer = group['Observer'][i]

            print("    {}".format(species))

            # Tag the Source with the species found there
            try:
                plot.addTag(species)
            except JavaException:
                logging.error("Exception adding tag. Retrying...")
                plot.addTag(species)
                logging.info("Successfully added tag on second try")

            measurements = group.iloc[
                i, first_measurement_column_number:].dropna()

            if group['Type'][i] == MEASUREMENT_TYPE_SITE:

                epoch.addInputSource(plot_name, plot)

                srcNames = Sets.newHashSet()
                srcNames.add(plot_name)

                insert_measurements(epoch, group, i, measurements, plot_name,
                                    species, srcNames, start, observer)

            elif group['Type'][i] == MEASUREMENT_TYPE_INDIVIDUAL:
                individual = plot.insertSource(
                    epoch_group,
                    start,
                    end,
                    protocol,
                    Maps.newHashMap(),
                    Optional.absent(),
                    u"{} {}".format(species, i + 1),
                    u"{}-{}-{}-{}".format(species, plot_name, start.toString(),
                                          i + 1),
                )

                epoch.addInputSource(individual.getLabel(), individual)
                srcNames = Sets.newHashSet()
                srcNames.add(individual.getLabel())
                insert_measurements(epoch, group, i, measurements, plot_name,
                                    species, srcNames, start, observer)
                epoch.addTag('individual')

    return 0