import argschema as ags
import ipfx.chirp as chirp
import logging
import traceback
from multiprocessing import Pool
from functools import partial
import allensdk.core.json_utilities as ju
from ipfx.stimulus import StimulusOntology
import ipfx.script_utils as su
[docs]class CollectChirpFeatureVectorParameters(ags.ArgSchema):
input_file = ags.fields.InputFile(
description="input text file with specimen numbers of each line",
default=None, allow_none=True)
include_failed_cells = ags.fields.Boolean(
description="whether to include failed cells",
default=False)
run_parallel = ags.fields.Boolean(
description="whether to use multiprocessing",
default=True)
output_dir = ags.fields.OutputFile(
description="output directory", default=None)
output_code = ags.fields.String(
description="output code for naming files", default=None)
chirp_stimulus_codes = ags.fields.List(ags.fields.String,
description="stimulus codes for chirps",
default=[
"C2CHIRP180503",
"C2CHIRP171129",
"C2CHIRP171103",
],
cli_as_single_argument=True)
data_source = ags.fields.String(
description="Source of NWB files ('sdk' or 'lims')",
default="sdk",
validate=lambda x: x in ["sdk", "lims"]
)
[docs]def edit_ontology_data(original_ontology_data, codes_to_rename,
new_name_tag, new_core_tag):
ontology_data = original_ontology_data.copy()
mask = []
for od in ontology_data:
mask_val = True
for tagset in od:
for c in codes_to_rename:
if c in tagset and "code" in tagset:
mask_val = False
break
mask.append(mask_val)
ontology_data = [od for od, m in zip(ontology_data, mask) if m is True]
ontology_data.append([
["code"] + codes_to_rename,
[
"name",
new_name_tag,
],
[
"core",
new_core_tag
]
])
return ontology_data
[docs]def data_for_specimen_id(specimen_id, data_source, ontology):
logging.debug("specimen_id: {}".format(specimen_id))
data_set = su.dataset_for_specimen_id(specimen_id, data_source, ontology)
if type(data_set) is dict and "error" in data_set:
logging.warning("Problem getting AibsDataSet for specimen {:d} from LIMS".format(specimen_id))
return data_set
# Identify chirp sweeps
try:
iclamp_st = data_set.filtered_sweep_table(clamp_mode=data_set.CURRENT_CLAMP)
iclamp_st = data_set.filtered_sweep_table(clamp_mode=data_set.CURRENT_CLAMP, stimuli=["Chirp"])
chirp_sweep_numbers = iclamp_st["sweep_number"].sort_values().values
except Exception as detail:
logging.warning("Exception when identifying sweeps from specimen {:d}".format(specimen_id))
logging.warning(detail)
return {"error": {"type": "sweep_table", "details": traceback.format_exc(limit=1)}}
if len(chirp_sweep_numbers) == 0:
logging.info("No chirp sweeps for {:d}".format(specimen_id))
return {"error": {"type": "processing", "details:": "no available chirp sweeps"}}
try:
result = chirp.extract_chirp_feature_vector(data_set, chirp_sweep_numbers)
except Exception as detail:
logging.warning("Exception when processing specimen {:d}".format(specimen_id))
logging.warning(detail)
return {"error": {"type": "processing", "details": traceback.format_exc(limit=1)}}
return result
[docs]def main(output_dir, output_code, input_file, include_failed_cells,
run_parallel, data_source, chirp_stimulus_codes, **kwargs):
with open(input_file, "r") as f:
ids = [int(line.strip("\n")) for line in f]
run_chirp_feature_vector_extraction(output_dir, output_code,
include_failed_cells, chirp_stimulus_codes=chirp_stimulus_codes,
specimen_ids=ids, run_parallel=run_parallel, data_source=data_source)
if __name__ == "__main__":
module = ags.ArgSchemaParser(schema_type=CollectChirpFeatureVectorParameters)
main(**module.args)